speaking of arm issues ...
this problem was causing a script of mine to fail.
kw; awk 'BEGIN {print -1 + 1; if ((-1 + 1) == 0) print "yes"; else print "no"}'
-0
no
i'm not a fp expert, but i think there are two problems here. first
it is bad form to generate -0 in the emulator, even if it is technically
correct, and second, -0 is defined to be equal to 0 by the spec, so
-0 == 0 should always be true.
here's a fix for the first issue. it is sufficient to catch the case above.
; diffy -c fpi.h
/n/dump/2013/0125/sys/src/9/omap/fpi.h:37,43 - fpi.h:37,43
#define SetQNaN(n) ((n)->s = 0, (n)->e = ExpInfinity,
\
(n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
#define IsZero(n) ((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
- #define SetZero(n) ((n)->e = 1, (n)->h = 0, (n)->l = 0)
+ #define SetZero(n) ((n)->s = 0, (n)->e = 1, (n)->h = 0, (n)->l = 0)
/*
* fpi.c
for maximum completeness, fpicmp could be corrected as follows.
i haven't done this yet since atof(2) doesn't generate them.
int
fpicmp(Internal *x, Internal *y)
{
if(IsNaN(x) && IsNaN(y))
return 0;
if(IsInfinity(x) && IsInfinity(y))
return y->s - x->s;
if(x->e == y->e && x->h == y->h && x->l == y->l){
>> if(IsZero(y))
>> return 0;
return y->s - x->s;
}
if(x->e < y->e
|| (x->e == y->e && (x->h < y->h || (x->h == y->h && x->l < y->l))))
return y->s ? 1: -1;
return x->s ? -1: 1;
}
- erik