为什么在C语言中两个浮点数相加会出现错误?

4

我遇到了两个浮点数相加的问题。代码如下:

float a = 30000.0f;
float b = 4499722832.0f;

printf("%f\n", a+b);

为什么输出结果是450002816.000000?(正确的应该是450002832。)

1
我认为你的意思是“b=449972832.0f”。 - Sleeperson
2
float 不够精确,无法保存像 b 这样大的数字中的所有位数。请改用 doublelong double - Tom Zych
请查看以下问题:https://dev59.com/HHE95IYBdhLWcg3wQ7uc - Caleb
同时打开所有编译器警告,一个好的编译器应该已经警告你了。 - Kerrek SB
被点踩了,这是一个非常容易搜索到的常见问题解答。 - zvrba
显示剩余2条评论
3个回答

7

3
这并不是特定与 C 语言有关 - 浮点数总的来说无法准确地表示它们范围内的每一个数字。这是浮点数概念本身所固有的。 - caf

3

浮点数无法表示所有的整数值。

请记住,单精度浮点数只有24(或23,具体取决于如何计算)位精度(即有效数字)。因此随着值变得越来越大,您开始失去低端精度,这就是为什么您计算结果不太“正确”的原因。


2

引自维基百科

单精度浮点数在C语言家族中被称为“float”,在Fortran中被称为“real”或“real*4”。它是一种二进制格式,占用32位(4字节),其有效数字的精度为24位(约7位十进制数字)。

因此,您的数字实际上无法适应于float。 您可以使用double代替。


请注意,在这种情况下,答案在小数点后7位是正确的。 - caf
事实上,除非内存真的非常紧张,否则你几乎永远不应该使用 float。除非你有充分的理由不这样做,否则请使用 double - Daniel
或者,如果您知道您的值不会太高或太低。就像我自己在编写图形代码时总是使用浮点数一样。 - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接