- Foreword
- Proposals Process
- 200x Membership
- 1 Introduction
- 2 Terms, notation, and references
- 3 Usage requirements
- 4 Documentation requirements
- 5 Compliance and labeling
- 6 Glossary
- 7 The optional Block word set
- 8 The optional Double-Number word set
- 9 The optional Exception word set
- 10 The optional Facility word set
- 11 The optional File-Access word set
- 12 The optional Floating-Point word set
- DFALIGN
- DFALIGNED
- DFFIELD:
- DF@
- DFLOAT+
- DFLOATS
- DF!
- D>F
- FABS
- FACOS
- FACOSH
- FALIGN
- FALIGNED
- FALOG
- FASIN
- FASINH
- FATAN
- FATANH
- FATAN2
- FCONSTANT
- FCOS
- FCOSH
- FDEPTH
- FDROP
- FDUP
- F/
- FEXP
- FEXPM1
- FE.
- FFIELD:
- F@
- FLITERAL
- FLN
- FLNP1
- FLOAT+
- FLOATS
- FLOG
- FLOOR
- FMAX
- FMIN
- F-
- FNEGATE
- FOVER
- F+
- FROT
- FROUND
- FSIN
- FSINCOS
- FSINH
- FSQRT
- FSWAP
- FS.
- F!
- FTAN
- FTANH
- FTRUNC
- F*
- F**
- FVALUE
- FVARIABLE
- F0=
- F0<
- F.
- F<
- F~
- F>D
- F>S
- PRECISION
- REPRESENT
- SET-PRECISION
- SFALIGN
- SFALIGNED
- SFFIELD:
- SF@
- SFLOAT+
- SFLOATS
- SF!
- S>F
- >FLOAT
- 13 The optional Locals word set
- 14 The optional Memory-Allocation word set
- 15 The optional Programming-Tools word set
- 16 The optional Search-Order word set
- 17 The optional String word set
- 18 The optional Extended-Character word set
- Annex A: Rationale
- Annex B: Bibliography
- Annex C: Compatibility analysis
- Annex D: Portability guide
- Annex E: Reference Implementations
- Annex F: Test Suite
- Annex H: Alphabetic list of words
12 The optional Floating-Point word set
12.1 Introduction
12.2 Additional terms and notation
12.2.1 Definition of terms
- float-aligned address:
-
The address of a memory location at which a floating-point
number can be accessed.
- double-float-aligned address:
-
The address of a memory location at which a 64-bit IEEE
double-precision floating-point number can be accessed.
- single-float-aligned address:
-
The address of a memory location at which a 32-bit IEEE
single-precision floating-point number can be accessed.
- IEEE floating-point number:
- A single- or double-precision floating-point number as defined in ANSI/IEEE 754-1985.
12.2.2 Notation
12.2.2.2 Stack notation
Floating-point stack notation is:A unified stack notation is provided for systems with the environmental restriction that the floating-point numbers are kept on the data stack.
12.3 Additional usage requirements
12.3.1 Data types
Append table 12.1 to table 3.1.
Symbol | Data type | Size on stack |
df-addr | double-float-aligned address | 1 cell |
f-addr | float-aligned address | 1 cell |
r | floating-point number | implementation-defined |
sf-addr | single-float-aligned address | 1 cell |
12.3.1.1 Addresses
The set of float-aligned addresses is an implementation-defined subset of the set of aligned addresses. Adding the size of a floating-point number to a float-aligned address shall produce a float-aligned address.
The set of double-float-aligned addresses is an implementation-defined subset of the set of aligned addresses. Adding the size of a 64-bit IEEE double-precision floating-point number to a double-float-aligned address shall produce a double-float-aligned address.
The set of single-float-aligned addresses is an implementation-defined subset of the set of aligned addresses. Adding the size of a 32-bit IEEE single-precision floating-point number to a single-float-aligned address shall produce a single-float-aligned address.
12.3.1.2 Floating-point numbers
The internal representation of a floating-point number, including the format and precision of the significand and the format and range of the exponent, is implementation defined.
Any rounding or truncation of floating-point numbers is implementation defined.
12.3.2 Floating-point operations
"Round to nearest" means round the result of a floating-point operation to the representable value nearest the result. If the two nearest representable values are equally near the result, the one having zero as its least significant bit shall be delivered.
"Round toward negative infinity" means round the result of a floating-point operation to the representable value nearest to and no greater than the result.
"Round toward zero" means round the result of a floating-point operation to the representable value nearest to zero, frequently referred to as "truncation".
12.3.3 Floating-point stack
A last in, first out list that shall be used by all floating-point operators.
The width of the floating-point stack is implementation-defined. The floating-point stack shall be separate from the data and return stacks.
The size of a floating-point stack shall be at least 6 items.
A program that depends on the floating-point stack being larger than six items has an environmental dependency.
12.3.4 Environmental queries
Append table 12.2 to table 3.4.See: 3.2.6 Environmental queries.
String Value data type | Constant? | Meaning | |
FLOATING-STACK | n | yes | the maximum depth of the separate floating-point stack. On systems with the environmental restriction of keeping floating-point items on the data stack, n = 0. |
MAX-FLOAT | r | yes | largest usable floating-point number |
12.3.5 Address alignment
Since the address returned by a CREATEd word is not necessarily aligned for any particular class of floating-point data, a program shall align the address (to be float aligned, single-float aligned, or double-float aligned) before accessing floating-point data at the address.See: 3.3.3.1 Address alignment, 12.3.1.1 Addresses.
12.3.6 Variables
A program may address memory in data space regions made available by FVARIABLE. These regions may be non-contiguous with regions subsequently allocated with , (comma) or ALLOT. See: 3.3.3.3 Variables.
12.3.7 Text interpreter input number conversion
If the Floating-Point word set is present in the dictionary and the current base is DECIMAL, the input number-conversion algorithm shall be extended to recognize floating-point numbers in this form:
Convertible string | := | <significand><exponent> |
<significand> | := | [<sign>]<digits>[.<digits0>] |
<exponent> | := | E[<sign>]<digits0> |
<sign> | := | { + | - } |
<digits> | := | <digit><digits0> |
<digits0> | := | <digit>* |
<digit> | := | { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } |
These are examples of valid representations of floating-point numbers in program source:
1E 1.E 1.E0 +1.23E-1 -1.23E+1
See: 3.4.1.3 Text interpreter input number conversion, 12.6.1.0558 >FLOAT.
12.4 Additional documentation requirements
12.4.1 System documentation
12.4.1.1 Implementation-defined options
- format and range of floating-point numbers (12.3.1 Data types, 12.6.1.2143 REPRESENT);
- results of 12.6.1.2143 REPRESENT when float is out of range;
- rounding or truncation of floating-point numbers (12.3.1.2 Floating-point numbers);
- size of floating-point stack (12.3.3 Floating-point stack);
- width of floating-point stack (12.3.3 Floating-point stack).
12.4.1.2 Ambiguous conditions
- DF@ or DF! is used with an address that is not double-float aligned;
- F@ or F! is used with an address that is not float aligned;
- floating point result out of range (e.g., in 12.6.1.1430 F/);
- SF@ or SF! is used with an address that is not single-float aligned;
- BASE is not decimal (12.6.1.2143 REPRESENT, 12.6.2.1427 F., 12.6.2.1513 FE., 12.6.2.1613 FS.);
- both arguments equal zero (12.6.2.1489 FATAN2);
- cosine of argument is zero for 12.6.2.1625 FTAN;
- d can't be precisely represented as float in 12.6.1.1130 D>F;
- dividing by zero (12.6.1.1430 F/);
- exponent too big for conversion (12.6.2.1203 DF!, 12.6.2.1204 DF@, 12.6.2.2202 SF!, 12.6.2.2203 SF@);
- float less than one (12.6.2.1477 FACOSH);
- float less than or equal to minus-one (12.6.2.1554 FLNP1);
- float less than or equal to zero (12.6.2.1553 FLN, 12.6.2.1557 FLOG);
- float less than zero (12.6.2.1618 FSQRT);
- float magnitude greater than one (12.6.2.1476 FACOS, 12.6.2.1486 FASIN, 12.6.2.1491 FATANH);
- integer part of float can't be represented by d in 12.6.1.1470 F>D;
- string larger than pictured-numeric output area (12.6.2.1427 F., 12.6.2.1513 FE., 12.6.2.1613 FS.);
- n can't be precisely represented as float in 12.6.2.2175 S>F;
- integer part of float can't be represented by n in 12.6.2.1471 F>S.
12.4.1.3 Other system documentation
- no additional requirements.
12.4.1.4 Environmental restrictions
- Keeping floating-point numbers on the data stack.
12.4.2 Program documentation
12.4.2.1 Environmental dependencies
- requiring the floating-point stack to be larger than six items (12.3.3 Floating-point stack);
- requiring floating-point numbers to be kept on the data stack, with n cells per floating point number.
12.4.2.2 Other program documentation
- no additional requirements.
12.5 Compliance and labeling
12.5.1 Forth-2012 systems
The phrase "Providing the Floating-Point word set" shall be appended to the label of any Standard System that provides all of the Floating-Point word set.The phrase "Providing name(s) from the Floating-Point Extensions word set" shall be appended to the label of any Standard System that provides portions of the Floating-Point Extensions word set.
The phrase "Providing the Floating-Point Extensions word set" shall be appended to the label of any Standard System that provides all of the Floating-Point and Floating-Point Extensions word sets.
12.5.2 Forth-2012 programs
The phrase "Requiring the Floating-Point word set" shall be appended to the label of Standard Programs that require the system to provide the Floating-Point word set.The phrase "Requiring name(s) from the Floating-Point Extensions word set" shall be appended to the label of Standard Programs that require the system to provide portions of the Floating-Point Extensions word set.
The phrase "Requiring the Floating-Point Extensions word set" shall be appended to the label of Standard Programs that require the system to provide all of the Floating-Point and Floating-Point Extensions word sets.
12.6 Glossary
12.6.1 Floating-Point words
- 12.6.1.0558 >FLOAT
- 12.6.1.1130 D>F
- 12.6.1.1400 F!
- 12.6.1.1410 F*
- 12.6.1.1420 F+
- 12.6.1.1425 F-
- 12.6.1.1430 F/
- 12.6.1.1440 F0<
- 12.6.1.1450 F0=
- 12.6.1.1460 F<
- 12.6.1.1470 F>D
- 12.6.1.1472 F@
- 12.6.1.1479 FALIGN
- 12.6.1.1483 FALIGNED
- 12.6.1.1492 FCONSTANT
- 12.6.1.1497 FDEPTH
- 12.6.1.1500 FDROP
- 12.6.1.1510 FDUP
- 12.6.1.1552 FLITERAL
- 12.6.1.1555 FLOAT+
- 12.6.1.1556 FLOATS
- 12.6.1.1558 FLOOR
- 12.6.1.1562 FMAX
- 12.6.1.1565 FMIN
- 12.6.1.1567 FNEGATE
- 12.6.1.1600 FOVER
- 12.6.1.1610 FROT
- 12.6.1.1612 FROUND
- 12.6.1.1620 FSWAP
- 12.6.1.1630 FVARIABLE
- 12.6.1.2143 REPRESENT
12.6.2 Floating-Point extension words
- 12.6.2.1203 DF!
- 12.6.2.1204 DF@
- 12.6.2.1205 DFALIGN
- 12.6.2.1207 DFALIGNED
- 12.6.2.1207.40 DFFIELD:
- 12.6.2.1208 DFLOAT+
- 12.6.2.1209 DFLOATS
- 12.6.2.1415 F**
- 12.6.2.1427 F.
- 12.6.2.1471 F>S
- 12.6.2.1474 FABS
- 12.6.2.1476 FACOS
- 12.6.2.1477 FACOSH
- 12.6.2.1484 FALOG
- 12.6.2.1486 FASIN
- 12.6.2.1487 FASINH
- 12.6.2.1488 FATAN
- 12.6.2.1489 FATAN2
- 12.6.2.1491 FATANH
- 12.6.2.1493 FCOS
- 12.6.2.1494 FCOSH
- 12.6.2.1513 FE.
- 12.6.2.1515 FEXP
- 12.6.2.1516 FEXPM1
- 12.6.2.1517 FFIELD:
- 12.6.2.1553 FLN
- 12.6.2.1554 FLNP1
- 12.6.2.1557 FLOG
- 12.6.2.1613 FS.
- 12.6.2.1614 FSIN
- 12.6.2.1616 FSINCOS
- 12.6.2.1617 FSINH
- 12.6.2.1618 FSQRT
- 12.6.2.1625 FTAN
- 12.6.2.1626 FTANH
- 12.6.2.1627 FTRUNC
- 12.6.2.1628 FVALUE
- 12.6.2.1640 F~
- 12.6.2.2035 PRECISION
- 12.6.2.2175 S>F
- 12.6.2.2200 SET-PRECISION
- 12.6.2.2202 SF!
- 12.6.2.2203 SF@
- 12.6.2.2204 SFALIGN
- 12.6.2.2206 SFALIGNED
- 12.6.2.2206.40 SFFIELD:
- 12.6.2.2207 SFLOAT+
- 12.6.2.2208 SFLOATS
ContributeContributions
JennyBrien [21] Mistake in the specification of significand?Example2016-07-03 16:20:50
Convertible string := <significand><exponent> <significand> := [<sign>]<digits>[.<digits0>] <exponent> := E[<sign>]<digits0> <sign> := { + | - } <digits> := <digit><digits0> <digits0> := <digit>* <digit> := { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
Surely it should be [<sign>]<digit>[.<digits0>] ? Only one digit allowed before the decimal point?
zhtoor [26] Implementations requiring BOTH 32 bit single floats and 64 bit double floats.Proposal2016-12-21 14:39:40
kc5tja [75] F>R and FR> to support dynamically-scoped floating point variablesProposal2019-03-03 06:20:52
AidanPitt-Brooke [285] Location of floats parsed from sourceRequest for clarification2023-02-17 02:48:38
Given the complete lack of words for transferring floating-point numbers between the data stack and the floating-point stack, a float recognised by the interpreter as per subsection 12.3.7 is presumably placed on the floating-point stack, if it exists. This is eminently reasonable and understandable, but it might be helpful to make it explicit: lacking any indication to the contrary, I naively assumed that such a float would be placed on the data stack and spent a bit of time looking for a word that would move it to the FP stack.
JimPeterson [296] Single-float-aligned May Be Improperly SpecifiedComment2023-04-15 18:29:05
"The set of single-float-aligned addresses is an implementation-defined subset of the set of aligned addresses."
Are you sure you want it specified this way? It seems over-constrained. For instance, on 64-bit Gforth systems, aligned addresses are multiples of 8 while sfaligned addresses are a superset of those, including all multiples of 4:
45 sfaligned . 48 ok
45 sfaligned sfloat+ . 52 ok
45 sfaligned sfloat+ aligned . 56 ok