10.12 不显示预期值

时间:2021-06-05 06:12:04

标签: floating-point precision

这些是 c 语句。为什么 10.12 没有显示预期值?

<块引用>

int main(){

    printf("10.10 =%.15lf\n",1.10);
    printf("10.12 = %.15lf\n",10.12);
    printf("10.15 = %.15lf\n",10.15);
    return 0; }

预期输出:-

10.10 =10.100000000000000

10.12 = 10.120000000000000

10.15 = 10.150000000000000

实际输出:-

10.10 =10.100000000000000

10.12 = 10.119999999999999

10.15 = 10.150000000000000

2 个答案:

答案 0 :(得分:3)

典型的 double 可以准确表示大约 264 个不同的值。 10.12 不是其中之一,因为每个可编码值都是一些 53 位整数乘以 2 的某个幂,并且 1012/100 不能完全表示为这样的。取而代之的是对附近的值进行编码:5697053528623677 * 2-49

10.119999999999999218...

当以足够的十进制进动打印时,会出现与 10.12 的舍入差异。


如果使用更高的精度,则 10.10 和 10.15 相同。

// 123456789012345 
10.099999999999999644...
10.119999999999999218...
10.150000000000000355...

答案 1 :(得分:1)

简单的原因是这个管道:

  1. 字符串10.12,一个十进制数
  2. 被解析并尽可能转换为二进制 IEEE 754 浮点数。
    • This page 是相关的,尽管它使用 32 位(单精度)浮点。见附图。 (注意页面本身以十进制表示存储的浮点数,这是下一步)
  3. 二进制 IEEE 754 浮点表示然后尽可能以十进制格式打印出来。有一些关于以十进制格式打印浮点数的有趣文章。例如:

a floating point representation