Am Freitag 11 Februar 2011, 22:39:05 schrieb David Laight:
The 'usual' non-IEEE fp systems are vax (you probably can't put enough memory in a vax to run wine!) and some arm systems where the two 32bit words of a double aren't stored in the expected order!
I don't expect to find any non-IEEE system where wine runs in the near future, or maybe in our lifetime. Its just that this function goes to great lengths to make sure it doesn't rely on the actual encoding that it is annoying that we have to give it up for detecting the sign of zeroes.
If anything I'd say lets just make the actual sign depend on the bits:
if(in == 0.0) { if( ((unsigned int) in) == 0x00000000) return 0x0000; else return 0x8000; } That way if a crazy system crosses our way that happens to encode 42.0 as 0x80000000 we'll get it right and just get the sign of zeroes wrong. However, I'd be glad if we had a really foolproof function.
-----------
For IEEE systems we could optimize the entire routine, protected by ifdefs: 1) Pick apart the 32 bit float like we do in the 16->32 case 2) Shift mantissa and exponent a bit to the right, taking care of rounding 3) Put them together as 16 bit 4) profit!
No exp() and other stuff needed.