Loss of precision errors in FP conversions

Robert Jacques sandford at jhu.edu
Tue Apr 19 19:57:50 PDT 2011


On Tue, 19 Apr 2011 20:37:47 -0400, bearophile <bearophileHUGS at lycos.com>  
wrote:
> dsimcha:
>
>> I know what you suggest could prevent bugs in a lot of
>> cases, but it also has the potential to get in the way in a lot of  
>> cases.
>
> You are right, and I am ready to close that enhancement request at once  
> if the consensus is against it.
>
> double->float and real->float cases are not so common. How often do you  
> use floats in your code? In my code it's uncommon to use floats,  
> generally I use doubles.

I do GP GPU work, so I use floats all the time. They're also useful for  
data storage purposes.

> A problem may be in real->double conversions, because I think D feels  
> free to use intermediate real values in some FP computations.

For your information, the x87 can only perform computations at 80-bits. So  
all intermediate values are performed using reals. It's just how the  
hardware works. Now I now some compilers (i.e. VS) allow you to set a  
flag, which basically causes the system to avoid intermediate values  
altogether or to use SIMD instructions instead in order to be properly  
compliant.

> Another possible problem: generic code like this is going to produce an  
> error because 2.0 literal is double, so x*2.0 is a double even if x is  
> float:
>
> T foo(T)(T x) {
>     return x * 2.0;
> }
>
> But when I use floats, I have found it good a C lint that spots  
> double->float conversions, because it has actually allowed me to speed  
> up some code that was doing float->double->float conversions without me  
> being aware of it.
>

Yes, this auto-promotion of literals is very annoying, and it would be  
nice if constants could smartly match the expression type. By the way,  
C/C++ also behave this way, which has gotten me into the habit of adding f  
after all my floating point constants.


More information about the Digitalmars-d mailing list