一个关于浮点数运算的问题。。。

时间:2023-01-08 12:52:36
int main(){
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解决了

#2


你先看一个表达式
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

#5


printf("decpart=%f\n",decpart);
缺省时输出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解决了

#2


你先看一个表达式
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

#5


printf("decpart=%f\n",decpart);
缺省时输出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.