gpt4 book ai didi

c - 如何解决 C 添加非常小的 float 的问题?

转载 作者:行者123 更新时间:2023-11-30 18:33:24 25 4
gpt4 key购买 nike

我读过几个问题,回答了这个问题如何工作,但没有回答如何解决它。我的程序使用 scanf 扫描 10 个 float ,并打印出所有 float 的总和、最小值、最大值和乘积。

例如,给定输入:

1.45 -2e2 -2e-2 14 -10.0 0.01 -0.02 20 -3e1 +4e+0

程序应该产生:

Sum is -200.58000
Min is -200.00000
Max is 20.00000
Product is -389.76000

但它会产生:

Sum is -200.58000
Min is -200.00000
Max is 20.00000
Product is -389.75999

我明白为什么会发生这种情况,但谁能告诉我如何解决这个问题?

这是我的代码:

#include <stdio.h>

int main() {
double min, max, sum, product;

printf("Sum is %.5f \n", sum);
printf("Min is %.5f \n", min);
printf("Max is %.5f \n", max);
printf("Product is %.5f \n", product);
}

最佳答案

您发现这个问题有如此多的解释,但没有找到这么多如何“修复它”的解决方案的原因是,在一组假设下,它没有被破坏,所以没有办法修复它。二进制浮点算术并不精确,也无意如此,更重要的是不能精确地表示十进制分数,也无意如此。不存在389.76这样的二进制 float ;您能得到的最接近值是 389.75999,因此打印 389.75999 的程序并没有错。

现在,我意识到这不是您想要的答案。在十进制 float 和纯数学中,数字 389.76 确实存在,这就是您想要的结果。那么,如果二进制计算机浮点运算不能给你这个结果,你能做什么呢?有几个答案:

  1. 在打印时(或之前)进行四舍五入。 (那么问题就变成了,要舍入到多少位?)
  2. 使用double而不是float。 (最后,double 具有所有相同的问题 - 它仍然是二进制浮点 - 但它提高的精度通常会导致不工作和工作之间的区别。)
  3. 滚动你自己的固定点。使用整数进行所有算术运算,但按照约定将它们乘以 100 或 1000。(如果您使用现金,这被称为“使用美分,而不是美元。”)
  4. 使用十进制算术库。 (我从未使用过这样的东西,但我认为有一个 here 。)
  5. 使用可以进行某种程度的符号操作的库来实现“纯数学”:它不仅可以表示像 389.76 这样的十进制数,还可以表示像 1/3 或 sqrt(2) 这样的有理数或无理数,全部为“他们自己”,具有数学上完全准确的结果。

关于c - 如何解决 C 添加非常小的 float 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57808735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com