D gets the rounding right, too
Walter Bright
newshound1 at digitalmars.com
Sun Jun 6 21:50:25 PDT 2010
http://www.reddit.com/r/programming/comments/cb8qv/incorrectly_rounded_conversions_in_gcc_and_glibc/
0.500000000000000166533453693773481063544750213623046875
Correct = 0x1.0000000000002p-1
dmd = 0x1.0000000000002p-1
strtod = 0x1.0000000000002p-1
3.518437208883201171875e13
Correct = 0x1.0000000000002p+45
dmd = 0x1.0000000000002p+45
strtod = 0x1.0000000000002p+45
62.5364939768271845828
Correct = 0x1.f44abd5aa7ca4p+5
dmd = 0x1.f44abd5aa7ca4p+5
strtod = 0x1.f44abd5aa7ca4p+5
8.10109172351e-10
Correct = 0x1.bd5cbaef0fd0cp-31
dmd = 0x1.bd5cbaef0fd0cp-31
strtod = 0x1.bd5cbaef0fd0cp-31
1.50000000000000011102230246251565404236316680908203125
Correct = 0x1.8p+0
dmd = 0x1.8p+0
strtod = 0x1.8p+0
9007199254740991.4999999999999999999999999999999995
Correct = 0x1.fffffffffffffp+52
dmd = 0x1.fffffffffffffp+52
strtod = 0x1.fffffffffffffp+52
and the code:
import std.c.stdio;
import std.c.stdlib;
const NUM_CONVERT = 6;
int main ()
{
uint i;
char decimal[NUM_CONVERT][60] = [
"0.500000000000000166533453693773481063544750213623046875",
"3.518437208883201171875e13",
"62.5364939768271845828",
"8.10109172351e-10",
"1.50000000000000011102230246251565404236316680908203125",
"9007199254740991.4999999999999999999999999999999995"
];
double gcc_conversion[NUM_CONVERT] = [
0.500000000000000166533453693773481063544750213623046875,
3.518437208883201171875e13,
62.5364939768271845828,
8.10109172351e-10,
1.50000000000000011102230246251565404236316680908203125,
9007199254740991.4999999999999999999999999999999995
];
char correct[NUM_CONVERT][30] = [
"0x1.0000000000002p-1",
"0x1.0000000000002p+45",
"0x1.f44abd5aa7ca4p+5",
"0x1.bd5cbaef0fd0cp-31",
"0x1.8p+0",
"0x1.fffffffffffffp+52"
];
for (i=0; i < NUM_CONVERT; i++)
{
printf ("%s\n",decimal[i].ptr);
printf (" Correct = %s\n",correct[i].ptr);
printf (" dmd = %a\n",gcc_conversion[i]);
printf (" strtod = %a\n\n",strtod(decimal[i].ptr,null));
}
return 0;
}
More information about the Digitalmars-d
mailing list