【问题标题】:Inexact float division不精确的浮点除法
【发布时间】:2015-03-22 17:18:39
【问题描述】:

当我看到这个时,我正在练习一些 c 编程:

#include <stdio.h>

int main (void){
printf("result %.50lf",(double)10.0/10000000.0);
return 0;
}

结果是 0.00000099999999999999995474811182588625868561393872

谁能解释一下为什么会这样?

【问题讨论】:

标签: c operation


【解决方案1】:

double 的内部表示是一个二进制浮点编码,它不能精确表示所有(或实际上大部分)小数,出于同样的原因,例如 1/3 不能精确表示十进制的10.0/10000000.0不能用二进制精确表示。

此外,64 位双精度二进制浮点具有大约 15 个十进制有效数字的精度,因此尝试输出 50 个小数位总是会以不相关和无意义的数字结束。双精度内的实际结果是 0.0000009999999999999999。

另请参阅:What Every Programmer Should Know About Floating-Point Arithmetic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2011-09-22
    相关资源
    最近更新 更多