-1

可能重复:
C 中的浮点问题

#include<stdio.h>
main()
{
        int a,b;
        float f;
        scanf("%2d%3d%4f",&a,&b,&f);
        printf("%d %d %f",a,b,f);
}

当我运行这个程序并输入 2 4 56.8 时,它会给出输出 2 4 56.799999 ......但我希望 2 4 56.8 ......为什么会这样???

4

4 回答 4

6

那是对的。浮点数是近似值。正如 0.33333333 是 1/3 的近似值一样,56.7999999 是 56.8 的近似值。0.1 没有精确的浮点表示。

看看已经写的一些内容:

于 2012-06-12T06:32:09.810 回答
0

56.8 不能以 C 编译器使用的浮点格式精确表示。请参阅David Goldberg 的《每位计算机科学家应该了解的关于浮点运算的知识》 (1991 年)。

于 2012-06-12T06:33:15.257 回答
0

这可能与浮点不准确有关。

于 2012-06-12T06:33:57.203 回答
0

所有浮点数都不能存储为其精确值,因为浮点数域的连续空间被映射到离散级别。例如,浮点数可以以IEEE754单精度格式存储。它将浮点数分三部分存储在 32 位内存中。假设[a, b]是可以用 IEEE754 格式精确表示的两个最接近的浮点数,但我们将在a和之间有无限数量的浮点数b,在这种情况下,这些数字将用a或来近似b。这会导致你正在经历的不精确。

该数字以规范化格式存储,尽管一些非常小的数字可以以非规范化格式存储。只是看看文件。

例如,在您的情况下,56.8 IEEE754 单点精度表示如下:

  • 符号:0(1 位)
  • 偏置指数:10000100(8 位)
  • 尾数:11000110011001100110011(23位)

现在,如果你将这个数字转换回十进制,那么你会得到

  • 符号为 0,即值为正
  • 10000100 = 132 偏差量 127 因此指数 = 132 - 127 = 5
  • 带有隐藏位的尾数 1.11000110011001100110011
  • 用指数调整小数点后(右移 5 位):111000.110011001100110011
    • 整数部分:111000 = 2^5 + 2^4 + 2^3 = 56
    • 小数部分:.110011001100110011 = 2^-1 + 2^-2 + 2^-5 + 2^-6 + 2^-9 + 2^-10 + 2^-13 + 2^-14 + 2^- 17 + 2^-18 = 0.799999237

因此,当您从 IEEE754 单精度格式检索值时,它变为: 56.799999237 您已存储 56.8

You can play with IEEE754 representation here: http://www.h-schmidt.net/FloatConverter/IEEE754.html

于 2012-06-12T07:08:18.100 回答