gpt4 book ai didi

c - c中的浮点不准确

转载 作者:太空狗 更新时间:2023-10-29 15:34:49 25 4
gpt4 key购买 nike

我知道浮点值在可以准确表达的数字中是有限的,我发现很多网站都描述了为什么会发生这种情况。但我还没有找到任何关于如何有效处理这个问题的信息。但我敢肯定 NASA 不同意 0.2/0.1 = 0.199999。示例:

#include <stdio.h>
#include <float.h>
#include <math.h>

int main(void)
{
float number = 4.20;
float denominator = 0.25;

printf("number = %f\n", number);
printf("denominator = %f\n", denominator);
printf("quotient as a float = %f should be 16.8\n", number/denominator);
printf("the remainder of 4.20 / 0.25 = %f\n", number - ((int) number/denominator)*denominator);
printf("now if i divide 0.20000 by 0.1 i get %f not 2\n", ( number - ((int) number/denominator)*denominator)/0.1);
}

输出:

number = 4.200000
denominator = 0.250000
quotient as a float = 16.799999 should be 16.8
the remainder of 4.20 / 0.25 = 0.200000
now if i divide 0.20000 by 0.1 i get 1.999998 not 2

那么我如何使用 float (或小数或 double )进行算术运算并获得准确的结果。希望我没有错过一些非常明显的事情。任何帮助都是极好的!谢谢。

最佳答案

解决方案是在不能接受舍入误差的应用程序中不使用 float 。使用扩展精度库(又名任意精度库),如 GNU MP Bignum .参见 this Wikipedia page一个不错的任意精度库列表。另请参阅关于 rational data types 的维基百科文章和 this thread了解更多信息。

如果您打算使用浮点表示法(floatdouble 等),那么使用可接受的方法编写代码来处理舍入错误(例如,避免 ==)。有很多关于如何执行此操作的在线文献,并且方法因所涉及的应用程序和算法而异。

关于c - c中的浮点不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168077/

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