[Beignet] [PATCH] libocl: fix degrees function precision issue.
Song, Ruiling
ruiling.song at intel.com
Thu Aug 6 19:54:21 PDT 2015
> I was surprised by this, so I wrote a program to test. Indeed, 180 / (float)M_PI is
> less precise:
>
> (float)(180 / M_PI) = 57.29577636718750000 (0x1.ca5dc0p+5) (0x42652ee0)
> (180 / (float)M_PI) = 57.29577636718750000 (0x1.ca5dc0p+5) (0x42652ee0)
> 57.295779513082321F = 57.29578018188476562 (0x1.ca5dc2p+5) (0x42652ee1)
It seems the precision loss was because pi has ultimate precision bits.
As division is not correctly rounded, but multiply is correctly rounded.
So I tried 180 * M_1_PI_F, (M_1_PI_F stands for 1.0/pi) the value is still (0x1.ca5dc0p+5) (0x42652ee0)
The correct value of 180/m_pi is 0x1.ca5dc1a63p+5.
When it is represented using single floating point, the guard bits are '110' (comes from 1a).
Using round to even rule, should be round-up. Then we got 0x1.ca5dc2p+5
The patch is good!
>
> A difference of one bit. :)
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list