[ ] conforms to ANS Forth. Gforth (Anton Ertl) iForth (Marcel Hendrix) CForth (Mitch Bradley) Open Firmware (Mitch Bradley) bigForth (Bernd Paysan) SwiftForth (Leon Wagner) SwiftX (Leon Wagner) JavaForth (Peter Knaggs) IronForth (Peter Knaggs) [ ] already implements the proposal in full since release [ ]. Gforth 0.1alpha (Anton Ertl) iForth 0 (Marcel Hendrix) amForth 0.1 (Matthias Trute) CForth (Mitch Bradley) Open Firmware (Mitch Bradley) bigForth 1.0 (Bernd Paysan) SwiftForth all (Leon Wagner) SwiftX all (Leon Wagner) TurboForth (Mark Wills, for TI-99/4A) [ ] 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. JavaForth (Peter Knaggs) IronForth (Peter Knaggs)
[ ] I have used (parts of) this proposal in my programs.
Leon Wagner
Bernd Paysan
Mitch Bradley
Anton Ertl
Marcel Hendrix
Matthias Trute
Mark Wills
[ ] I would use (parts of) this proposal in my programs if the systems
I am interested in implemented it.
Anton Ertl
Marcel Hendrix
Matthias Trute
Mark Wills
[ ] I would use (parts of) this proposal in my programs if this
proposal was in the Forth standard.
Mark Wills
[ ] I would not use (parts of) this proposal in my programs.
Tim Partridge
You forget 4.1.2: producing a result out of range, e.g., multiplication (using *) results in a value too big to be represented by a single-cell integer (6.1.0090 *, 6.1.0100 */, 6.1.0110 */MOD, 6.1.0570 >NUMBER, 6.1.1561 FM/MOD, 6.1.2214 SM/REM, 6.1.2370 UM/MOD, 8.6.1.1820 M*/);He also writes that JavaForth and IronForth do not implement this proposal and throw -11 when an overflow occurs.
Hans Bezemer writes:
4tH is implemented in C and consequently takes on the identity of the compilant. And that is how it should be IMHO. Enforcing 2s-complement would mean implementing my own arithmatic routines - and that I won't do. On the other hand, lots of double, unsigned and floating point library routines of 4tH are based on 2s complement. However, if a user on a signed magnitude or 1s complement machine would adapt them and offer them for inclusion, I'd include 'em. I think a standard should unify stuff by abstraction - not exclude technologies by being specific. So, this vote is a whole-hearted NO. If this means 4tH is diverging from Forth-200x then it is what it is.
Changes since the first RfD:
Decided what to do about F>S F>D (overflow stays an ambiguous
condition).
Added a number of additional changes to the Proposal part.
Summarized feedback up to now in the Comments section, plus an answer.
Problem
Many programs depend on 2s-complement representation of negative
integers (e.g., assuming that TRUE is -1), and on wraparound behaviour
on integer overflow; examples are hash functions and cryptography. In
the current standard these programs need to declare an environmental
dependency on these features. These programs should become
unconditionally standard programs.
To my knowledge, all Forth systems provide these features and all
architectures developed since about 1970 support 2s-complement (this
includes Chuck Moore's chips), so other signed number representations
are now even less relevant than in the past (when they did not lead to
non-2s-complement Forth systems, either).
Solution
Negative integers are represented as 2s-complement numbers.
On integer overflow of single-cell addition (+ 1+ +! cell+ char+ etc.),
subtraction (- 1- negate abs), multiplication (* chars cells floats
etc.), 2* and d>s the result is the exact result modulo 2^n (for n-bit
cells) leading to wraparound behaviour for + and -; for overflow of d+
d- dnegate dabs m+, the result is the exact result modulo 2^(2*n).
Division by 0 is still an ambiguous condition, as well as when the
division result does not fit into the result type (some architectures
produce exceptions in these cases, others don't).
For F>D and F>S it is still an ambiguous condition if the result does
not fit into the result type (e.g., Gforth produces 0 for F>D with
many too-big inputs).
Typical use
: within ( n a b -- f )
over - >r - r> u< ;
Implementing this without relying on wrap-around arithmetics
is complicated.
Proposal
Remove "Programs that use flags as arithmetic operands have an
environmental dependency." from 3.1.3.1.
Remove permission for one's complement and sign-magnitude from 3.2.1.1.
Replace 3.2.2.2 with:
|In all integer arithmetic operations except divisions, both overflow
|and underflow shall be ignored. The value returned when either
|overflow or underflow occurs in these cases is:
|
|for unsigned results, the exact result modulo 2^n
|
|for signed results, with the exact result being r, the number x in the
|range 2^(n-1)<=x<2^(n-1) that satisfies x congruent r (mod 2^n).
|
|where n is the number of bits in the result.
(can we make this any more understandable without losing precision?).
Replace -32767 with -32768 in 3.1.3.2
4.1.1: Delete "values returned after arithmetic overflow (3.2.2.2
Other integer operations);"
6.1.0570: "An ambiguous condition exists if ud2 overflows during the
conversion." I guess we want to keep that.
A.3.1.2: Delete a) 3)
Delete references to ones-complement and sign-magnitude from A.3.2.1
A.3.2.2.2: Replace "For example, the phrase 1 2 - underflows if the
result is unsigned and produces the valid signed result -1." with "For
example, the phrase 1 2 - underflows and produces the largest unsigned
number if the result is unsigned and produces the valid signed result
-1."
Change example in A.5.2.2 from a dependence on twos-complement to
something else, e.g., byte order.
A.6.2.2440: Delete "For two's-complement machines that ignore
arithmetic overflow (most machines),".
A.8.6.1.1140: Replace the section with: "An alias for DROP that
conveys the intent to convert a double-cell to a single-cell integer.
The original intention of this word was to support signed-number
representations other than twos-complement.".
Delete D.3.2
(Any other places we have to look after?)
Reference implementation
Any current Forth system.
Test cases
T{ 0 invert -> -1 }T
T{ MAX-INT 1+ -> MIN-INT }T
More TBD.
Experience
Universally implemented and widely used.
Comments
Several reactions support the proposal.
Some reactions oppose the proposal, but they give philosophical
reasons (it seems that the idea of these reactions is that the Forth
standard should be machine-independent beyond actually existing
machines) rather than pointing out any real problems that are foreseen
from adopting this proposal.
Note that the Forth standard already contains a number of assumptions
about the machine and environment. E.g., an ASCII-compatible
character set (although there are machines that mostly work with other
character sets), or that cells have at least 16 bits (although there
are machines with smaller word size), or that cells consist of bits
(binary base) rather than, say, decimal digits (decimal computers also
used to exist and have died out, like 1s-complement).
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.