[ ] conforms to ANS Forth. iForth (Marcel Hendrix) VFX Forth for Windows, Linux and DOS (Stephen Pelc) Gforth (Anton Ertl) [ ] already implements the proposal in full since release [ ]. iForth 3.0.3 (Marcel Hendrix) kForth 1.0.14 (Krishna Myneni) Win32Forth 1 (George Hubert) Gforth 0.7.0 (Anton Ertl) [ ] implements the proposal in full in a development version. [ ] will implement the proposal in full in release [ ]. 4th 3.5d release 2 (Hans Bezemer) [ ] will implement the proposal in full in some future release. [ ] There are no plans to implement the proposal in full in [ ]. [ ] will never implement the proposal in full.
[ ] I have used (parts of) this proposal in my programs. Hans Bezemer Marcel Hendrix Krishna Myneni George Hubert [ ] I would use (parts of) this proposal in my programs if the systems I am interested in implemented it. David N. Williams [ ] I would use (parts of) this proposal in my programs if this proposal was in the Forth standard. David N. Williams Stephen Pelc [ ] I would not use (parts of) this proposal in my programs.
Author: Krishna Myneni Version 2.2 -- 28 April 2009 Version 2.1 -- 25 April 2009 Version 2 -- 24 April 2009 Version 1 -- 15 April 2009 Version 0 -- 10 April 2009 Problem ======= In practice, floating point calculations sometimes require rounding of a floating point number to a nearby integer, with the result being the floating point representation of the integer. ANS Forth provides two words in the optional floating point wordset, FROUND and FLOOR, for performing such rounding. FROUND (DPANS94, 188.8.131.522) and FLOOR (DPANS94, 184.108.40.2068), which, respectively, provide rounding to the nearest integer, and rounding to the nearest integer on the side of the number line towards negative infinity. Another common form of rounding, often employed, is rounding to the nearest integer on the side of the number line towards zero. The latter form of rounding is often referred to colloquially as "truncation". ANS Forth does not provide a word for rounding towards zero, and returning a floating point representation of the resulting integer. This type of operation is usually carried out through an awkward, and, on non-optimizing systems, inefficient sequence of words, F>D, followed by D>F. On Forth systems which support the use of signed floating point zero, the sequence, F>D D>F, will fail to produce a result (-0E) compatible with the IEEE floating point arithmetic standard (IEEE FP), for an argument, r, such that -1E < r < 0E, and for r = -0E. Proposal ======== Include a standard word, named "FTRUNC", to perform "truncation", i.e. rounding of a floating point number towards zero, returning a floating point representation of the resulting integer. FTRUNC f-trunc FLOATING ( F: r1 -- r2 ) Round r1 to an integral value using the "round towards zero" rule, giving r2. Reference Implementation ======================== Reference Implementation Testing ======= Tests Remarks ======= -- FTRUNC complements the ANS Forth words, FROUND and FLOOR, which also return floating point values. -- The Intel FPU instruction set contains FRNDINT, which, with the NDP control word appropriately set, will perform the specified truncation, and leave the floating point result on top of the FPU stack in a single instruction. -- For consistency with the IEEE floating point arithmetic standard (usually abbreviated as IEEE FP), Forth systems which provide a representation for floating point negative zero must return r2 as floating point negative zero (-0E) in the following cases: -1E < r1 < 0E, and r1 = -0E. However, no provision in the current ANS Forth standard, or currently proposed revisions to the standard, guarantees a program can distinguish systems which support -0E. Hence, the sign of floating point zero is unspecified for the above cases of r1. -- The tests can be made more rigorous with respect to floating point negative zero, if the Forth standard provides a feature enabling a program to check the Forth system for support of fp negative zero. A method which should work in practice on most, if not all, current systems that provide floating point negative zero is 0E FNEGATE 0E 0E F~ 0= However, in order to guarantee the proper result, the specification for FNEGATE must state that the result of applying FNEGATE to 0E is -0E (and vice-versa). Another approach is to provide an environmental query for the presence of fp signed zero. Either provision will require its own separate proposal to modify the Forth standard. -- The current ANS Forth specification of F>D is ambiguous. Even though the adoption of a common meaning seems to have occurred, it is nevertheless advisable to revise the language specifying the F>D operation to remove the ambiguity. A separate proposal is warranted for standardization of F>D. Below is the current language of the ANS Forth specification for F>D. F>D f-to-d FLOATING ( -- d ) ( F: r -- ) or ( r -- d ) d is the double-cell signed-integer equivalent of the integer portion of r. The fractional portion of r is discarded. An ambiguous condition exists if the integer portion of r cannot be precisely represented as a double-cell signed integer. Although not specified in the standard, the type of truncation performed is typically truncation towards zero. An extensive discussion of the type of truncation which should be performed by F>D was held on comp.lang.forth several years ago, and the consensus at that time appeared to be that F>D should perform truncation towards zero. Experience ========== -- Many languages which provide floating point support, e.g. C, Lisp, FORTRAN, implement a standard word for the floating point rounding towards zero, or "truncation". -- In early Forth systems, LMI's UR/Forth provided FTRUNCATE, which, reportedly was equivalent to the sequence, F>D D>F. -- The following contemporary Forth systems provide a word for rounding a floating point number towards zero, and returning a floating point representation of the result: System | Word Name | Conforms to specification in this Rfd ------------------------------------------------------------------ PFE | FTRUNC | yes Gforth | FTRUNC | yes (1) kForth | FTRUNC | yes VFX Forth | FINT | yes iForth | FTRUNC | yes Win32Forth | FTRUNC | yes (1) Defined as F>D D>F
Note that you can be both a system implementor and a programmer, so you can submit both kinds of ballots.
[ ] conforms to ANS Forth. [ ] already implements the proposal in full since release [ ]. [ ] implements the proposal in full in a development version. [ ] will implement the proposal in full in release [ ]. [ ] will implement the proposal in full in some future release. [ ] There are no plans to implement the proposal in full in [ ]. [ ] will never implement the proposal in full.If you want to provide information on partial implementation, please do so informally, and I will aggregate this information in some way.
[ ] I have used (parts of) this proposal in my programs. [ ] I would use (parts of) this proposal in my programs if the systems I am interested in implemented it. [ ] I would use (parts of) this proposal in my programs if this proposal was in the Forth standard. [ ] I would not use (parts of) this proposal in my programs.If you feel that there is closely related functionality missing from the proposal (especially if you have used that in your programs), make an informal comment, and I will collect these, too. Note that the best time to voice such issues is the RfD stage.
Proponent: Krishna Myneni People who contributed to/influenced this Rfd (from discussions on comp.lang.forth and email correspondence): George Hubert, "Ed", Bruce McFarling, Marcel Hendrix, Hans Bezemer, Anton Ertl, Andrew Haley, C.G. Montgomery, David N. Williams, Stephen Pelc Votetaker: M. Anton Ertl