powf(float,float) function from math.h on ARM32-bit platform
Michael Veksler
mveksler@tx.technion.ac.il
Tue Jul 30 17:24:00 GMT 2013
On 07/30/2013 02:59 PM, hemant wrote:
>
> I have written a std code for ARM 32-bit platform using math.h library and
> float=powf(float,float) function. When I give input to my system as 100 ^
> 4.4 it gives me answer as 630957632.0000 (as float) whereas calculator in
> WindowsXP gives answer as 630957344.48019324943436013662234.
>
> I just want to know which one is more accurate ???? why is difference ?????
> on what things accuracy depends????
>
> Also what do we mean by "arbitrary"-precision??? I have read such word on
> MSDN help forums.
>
> how much accurate is my system???? how to improve accuracy??????
You should read:
http://en.wikipedia.org/wiki/IEEE_754
The reason is that 4.4 is not accurately represented
in binary. This is like 1/3 which isn't accurately represented
in decimal.
To calculate the impact of this inaccuracy, you need to
consider the structure of float. Float has 23 bits
fraction+one leading '1' bit. This means that you have
a 24 bit significand. Assuming 'round to nearest'
error= 4.4* 2.0^{-24}
And the float value is around 4.4+/- error.
I computed this with 'bc' using scale=100 and got
100^(4.4+error)-100^4.4 = 762.0...
100^(4.4-error)-100^4.4 = -762.0...
Before even considering the inaccuracy of assigning
pow's result to float, you get an answer which can be
off by +/- 762.
Also, since pow(b,e) is implemented, as far as I know,
by exp(log(b)*e) you've got 3 operations and not one,
which add up their inaccuracies. So your *theoretical*
accuracy is even lower, much lower since most
inaccuracies are accumulated to the argument of 'exp'.
It's probably around +/-2286.
This explains why you've got a result which is off by
nearly 300. It could have been much worse.
Michael
More information about the Gcc
mailing list