浮点打印不准确

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

#include 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 ….为什么会这样???

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

看看已写的一些内容:

56.8在C编译器使用的浮点格式中不能完全表示。 请参阅David Goldberg撰写的每个计算机科学家应该知道的关于浮点算术的内容 (1991)。

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

该数字以标准化格式存储,尽管一些非常小的数字可以以非标准化格式存储。 看看文件吧。

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

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

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

  • sign为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

您可以在此处使用IEEE754表示: http ://www.h-schmidt.net/FloatConverter/IEEE754.html

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