【问题标题】:5456.367 -> 5456.367188. Is this because float precision in c?5456.367 -> 5456.367188。这是因为c中的浮点精度吗?
【发布时间】:2021-12-11 17:08:43
【问题描述】:

我有一个这样的 C 程序:

#include <stdio.h>

int main() {
    float number = 0;
    scanf("%f", &number);
    printf("%f\n", number);
}

输出是:

ururay@note:~/workspace/c/float-precision$ gcc float-precision.c -o float-precision
ururay@note:~/workspace/c/float-precision$ ./float-precision 
5456.367
5456.367188

我已经多次执行这个程序,输出是一样的。 '188' 是否因为浮点精度而“附加”到数字的末尾?如果是这样,我怎么能在二进制表示中识别它?

【问题讨论】:

  • 简短回答:是的。长答案:是的。
  • 请参阅Is floating point math broken?Why Are Floating Point Numbers Inaccurate? 另请注意,floatbinary 值中没有“附加”任何内容,也没有“存在”5456.367 . printf 的默认位置数为 6,因此您可以:printf("%.3f\n", number); 获得 3 个位置。但是在这里,您有 7 个有效数字,无论如何都可以使用 float 类型完成的限制。
  • 您的问题被回答为“是”,您想问的任何其他问题几乎都可以保证是 Weathers 提案的副本。请edit询问其他问题或确认重复。
  • 这能回答你的问题吗? Why are floating point numbers inaccurate?

标签: c precision


【解决方案1】:

数字5456.367 不能以IEEE-754 单精度浮点格式精确表示。

最接近的数字是5456.3671875,它的二进制表示为01000101101010101000001011110000。下一个较小的可表示数字是5456.3666992,它的二进制表示为01000101101010101000001011101111

【讨论】:

  • 确实,无论您有多少位精度,它都无法以任何二进制浮点格式精确表示。 367/1000 是最低的,它的分母不是 2 的幂。
【解决方案2】:

是的,如果您想要更高的精度,请尝试使用doublelong double(但long double 比其他类型慢得多,或者引用与double 相同的类型)。

另外 printf 只需要doublelong double 去看看the spec of printf

【讨论】:

  • 事实上,放双精度为 5456.367 -> 5456.367000。
  • @ThiagoUruray:即使是double 也不能准确地代表这个数字。它表示为5456.367000000000189174897968769073486328125。您必须使用不同的 printf 格式说明符打印更多数字才能看到不准确之处。
  • @ThiagoUruray:使用double 不会为5456.367 提供5456.367000 的值。 “5456.367000”只是打印小数点后四舍五入的数字时得到的结果。实际值,在double常用的格式中,是5456.367000000000189174897968769073486328125。
  • 你们两个是对的! printf("%.20lf\n", number) => 5456.36700000000018917490
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2018-08-17
  • 2011-04-18
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多