At 23:42 +0100 1/15/13, Nick Wellnhofer wrote:
>This function is quite obviously wrong:
>
>    PARROT_PURE_FUNCTION
>    static int
>    auxcmpfunc(ARGIN(const FLOATVAL *i), ARGIN(const FLOATVAL *j))
>    {
>        ASSERT_ARGS(auxcmpfunc)
>        return (int) (*i - *j);
>    }
>
>You can't just cast a floating-point difference to integer and expect it would 
>do the right thing. Every result between -0.5 and 0.5 will result in a zero 
>integer meaning equality although the values compared are in fact different. 
>Something like that should work:
>
>    if (*i == *j) return 0;
>    if (*i <  *j) return -1;
>    else          return 1;
>
>On another note, the line "ASSERT_ARGS(auxcmpfunc)" is useless. auxcmpfunc 
>will always be non-null.
>

Back in the days of Control Data floating point one could get far better speed 
by taking advantage of the fact that a 48 bit integer with the same bit pattern 
of a float was bigger than, smaller than, or equal to another bit pattern which 
is really another float.

In C that kind of thing would have been a union but assembly was the real 
language at the time. FORTRAN didn't have any numbers after it.

Normalized IEEE floats exhibit the same characteristic and the comparison will 
work in 64 bits if the commands provided on the processor chip can get the 
floats into registers than can be compared as integers. Would the speed be any 
better than floating point subtractions in hardware? - I donno.

There is also the question of just what does one mean by equality when 
inequality can be an artifact of the likes of decimal to binary conversion of 
fractions with a finite number of bits.

-- 

-->  Halloween  == Oct 31 == Dec 25 == Christmas  <--
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to