gpt4 book ai didi

c - 两个 float 的除法给出了错误的答案

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

尝试使用以下代码在 C 中划分两个 float :

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

int main(){
float fpfd = 122.88e6;
float flo = 10e10;
float int_part, frac_part;

int_part = (int)(flo/fpfd);
frac_part = (flo/fpfd) - int_part;

printf("\nInt_Part = %f\n", int_part);
printf("Frac_Part = %f\n", frac_part);

return(0);
}

对于这段代码,我使用命令:

>> gcc test_prog.c -o test_prog -lm
>> ./test_prog

然后我得到这个输出:

Int_Part = 813.000000
Frac_Part = 0.802063

现在,这个 Frac_part 似乎是不正确的。我先在计算器上尝试了相同的方程式,然后在 Wolfram Alpha 中尝试了相同的方程式,它们都给了我:

Frac_Part = 0.802083

请注意小数点后第五位的数字不同。

这对大多数人来说似乎微不足道,但对于我正在做的计算来说,这是至关重要的。

任何人都可以向我解释为什么 C 代码会出现此错误吗?

最佳答案

当浮点运算的精度不足时,最自然的第一步就是只使用精度更高的浮点类型,例如使用 double而不是 float . (正如其他答案中立即指出的那样。)

其次,检查不同的浮点运算并考虑它们的精度。对我来说最突出的一个错误来源是上面通过简单地转换为 int 和减法将 float 分为整数部分和小数部分的方法。这并不理想,因为当您从原始值中减去整数部分时,您在进行算术运算,其中涉及的三个数字(两个输入和结果)具有非常不同的比例,这可能会导致精度损失。

我建议使用 C <math.h>函数 modf而是将 float 拆分为整数和小数部分。 http://www.techonthenet.com/c_language/standard_library_functions/math_h/modf.php

(更详细地说:当您执行类似 f - (int)f 的操作时,浮点加法过程将看到正在添加某些给定精度 X 的两个数字,并且自然会假设结果也将有精度X。然后它会在那个假设下进行实际计算,最后重新评估结果的精度。因为最初的预测结果并不理想,一些低位会丢失。)

关于c - 两个 float 的除法给出了错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32205047/

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