double v=99999999.99999;
double intpart,decpart;
decpart=modf(v,&intpart);
printf("decpart=%f\n",decpart);
int j=0;
for(;(j<6);j++){
decpart=decpart*10;
printf("decpart=%f\n",decpart);
}
}
执行结果如下:
decpart=0.999990
decpart=9.999900
decpart=99.999000
decpart=999.990001
decpart=9999.900013
decpart=99999.000132
decpart=999990.001321
在windows和linux下编译运行都是如此,不是说c的double类型支持16位有效数字吗?怎么会这样?
10 个解决方案
#1
c的精度不够
我也碰到过这种情况
后来改用fortran解决了
我也碰到过这种情况
后来改用fortran解决了
#2
你先看一个表达式
double dblValue=0.52;
assert( dblValue == 0.52 ) // 这样是不一定正确的
assert( fabs(dblValue-0.52) < 0.0001 ) // 这样才正确
C的浮点不精确性一直都存在,迫使在写程序时都要注意这个 "BUG"
double dblValue=0.52;
assert( dblValue == 0.52 ) // 这样是不一定正确的
assert( fabs(dblValue-0.52) < 0.0001 ) // 这样才正确
C的浮点不精确性一直都存在,迫使在写程序时都要注意这个 "BUG"
#3
数一数,你的1321好像是从十七位开始的也。
#4
那么换一下
int main(){
double v=99999999.16;
double intpart,decpart;
decpart=modf(v,&intpart);
printf("decpart=%f\n",decpart);
int j=0;
for(;(j<6);j++){
decpart=decpart*10;
printf("decpart=%f\n",decpart);
}
结果为
decpart=0.160000
decpart=1.600000
decpart=16.000000
decpart=159.999996
decpart=1599.999964
decpart=15999.999642
decpart=159999.996424
int main(){
double v=99999999.16;
double intpart,decpart;
decpart=modf(v,&intpart);
printf("decpart=%f\n",decpart);
int j=0;
for(;(j<6);j++){
decpart=decpart*10;
printf("decpart=%f\n",decpart);
}
结果为
decpart=0.160000
decpart=1.600000
decpart=16.000000
decpart=159.999996
decpart=1599.999964
decpart=15999.999642
decpart=159999.996424
#5
printf("decpart=%f\n",decpart);
缺省时输出6位小数。
printf("decpart=%17.16f\n", decpart); 就可以看到16位小数了。
缺省时输出6位小数。
printf("decpart=%17.16f\n", decpart); 就可以看到16位小数了。
#6
可是不管多少位小数,都不是精确结果啊?
#7
调用decpart=modf(v, &intpart)之后,decpart的值其实是0.999990001320838928,这是由于IEEE浮点格式表示数据时造成的误差。
#8
你的V 其实是 99999999.999990001321 , 的确精确到了16位。这个误差是允许的。
#9
要用pritnf("%lf",……)啊!
#10
well, this is not a c/c++'s problem. floating numbers can not be all represented precisely in computers. if interested, you can have a look at the ieee standards for floating number representation. search for it in google. tons of information about that on the internet.
#1
c的精度不够
我也碰到过这种情况
后来改用fortran解决了
我也碰到过这种情况
后来改用fortran解决了
#2
你先看一个表达式
double dblValue=0.52;
assert( dblValue == 0.52 ) // 这样是不一定正确的
assert( fabs(dblValue-0.52) < 0.0001 ) // 这样才正确
C的浮点不精确性一直都存在,迫使在写程序时都要注意这个 "BUG"
double dblValue=0.52;
assert( dblValue == 0.52 ) // 这样是不一定正确的
assert( fabs(dblValue-0.52) < 0.0001 ) // 这样才正确
C的浮点不精确性一直都存在,迫使在写程序时都要注意这个 "BUG"
#3
数一数,你的1321好像是从十七位开始的也。
#4
那么换一下
int main(){
double v=99999999.16;
double intpart,decpart;
decpart=modf(v,&intpart);
printf("decpart=%f\n",decpart);
int j=0;
for(;(j<6);j++){
decpart=decpart*10;
printf("decpart=%f\n",decpart);
}
结果为
decpart=0.160000
decpart=1.600000
decpart=16.000000
decpart=159.999996
decpart=1599.999964
decpart=15999.999642
decpart=159999.996424
int main(){
double v=99999999.16;
double intpart,decpart;
decpart=modf(v,&intpart);
printf("decpart=%f\n",decpart);
int j=0;
for(;(j<6);j++){
decpart=decpart*10;
printf("decpart=%f\n",decpart);
}
结果为
decpart=0.160000
decpart=1.600000
decpart=16.000000
decpart=159.999996
decpart=1599.999964
decpart=15999.999642
decpart=159999.996424
#5
printf("decpart=%f\n",decpart);
缺省时输出6位小数。
printf("decpart=%17.16f\n", decpart); 就可以看到16位小数了。
缺省时输出6位小数。
printf("decpart=%17.16f\n", decpart); 就可以看到16位小数了。
#6
可是不管多少位小数,都不是精确结果啊?
#7
调用decpart=modf(v, &intpart)之后,decpart的值其实是0.999990001320838928,这是由于IEEE浮点格式表示数据时造成的误差。
#8
你的V 其实是 99999999.999990001321 , 的确精确到了16位。这个误差是允许的。
#9
要用pritnf("%lf",……)啊!
#10
well, this is not a c/c++'s problem. floating numbers can not be all represented precisely in computers. if interested, you can have a look at the ieee standards for floating number representation. search for it in google. tons of information about that on the internet.