I support this routine on SAS for Windows (both 32-bit and x64 Windows).
This issue is not OS related. The issue pertains to floating point representation on the x64 processors. IEEE floating point representation can only represent 15 digits of accuracy. Sometimes you can see 16 digits of accuracy. In the initial example, the 15 digits of accuracy is easily exceeded even though there are cases where the result is the exact representation for 0.5.
The routine used to compute the result is different on Windows than on any other host (Linux, UNIX, AIX, etc.). The routine is written in x64 assembly to maximize performance since almost every alpha-numeric in SAS is processed by this routine. The algorithm used has existed since I wrote the routine back in v6.03 SAS for PC-DOS (16-bit). Only the instruction set has changed.
Here’s an example to show this issue:
33 data _null_;
34 x=0.5000000000000000000000000;
35 y=0.5000000000000000000000001;
36 put x= hex16. y= hex16.;
37 run;
x=3FDFFFFFFFFFFFFF y=3FDFFFFFFFFFFFFF
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
In this case, the result is slightly less than 0.5 for x as well as y. However, y should be different. A comparison of these two variables would be equal but should not as we know.
Here’s another example to show this issue:
38 data _null_;
39 x=0.500000000000000000000000;
40 y=0.500000000000000000000001;
41 put x= hex16. y= hex16.;
42 run;
x=3FE0000000000000 y=3FE0000000000000
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
In this case, the result is exactly 0.5 for x as well as y by reducing the number of trailing zeros. However, y should be different. A comparison of these two variables would be equal again but should not as we know.
Now, let’s reduce the trailing zeros to where the least significant digit can be seen in the result.
58 data _null_;
59 x=0.5000000000000000;
60 y=0.5000000000000001;
61 put x= hex16. y= hex16.;
62 run;
x=3FE0000000000000 y=3FE0000000000001
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
A comparison for x and y in this case would be not equal and rightfully so.
When comparing floating point numbers, the COMPFUZZ function is recommended.
http://support.sas.com/documentation/cdl/en/lefunctionsref/67960/HTML/default/viewer.htm#p0ifledavu3rv1n10gclzxbyy0ul.htm
... View more