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

Reply via email to