This question already has answers here:
'float' vs. 'double' precision
                                
                                    (6个答案)
                                
                        
                                2年前关闭。
            
                    
一个操作员似乎在我的C代码中产生了错误的结果。
首先,这些是我在代码中声明变量的行(在main函数之外,一般范围):

FILE *fenergy;
float p1,p2,p3;
float FinalEnergy, EnergyState;


然后,我调用一个函数,该函数按顺序执行下一行代码:

p1=FinalEnergy;
p2=EnergyState;
FinalEnergy=FinalEnergy+EnergyState;

fprintf(fenergy,"p1=%f p2=%f   Final=%f",p1,p2,FinalEnergy);


使用功能可以正确启动文件“ fenergy”:

fenergy=fopen(energy.txt,"w");


在前一百万步中,所有变量的值似乎都是正确的,但随后该行中的“ +”运算符:

FinalEnergy=FinalEnergy+EnergyState;


输出错误。这是fprintf函数编写的文件输出的结果的示例:

p1=-130482984.000000 p2=-23.000000   Final=-130483008.000000
p1=-130483008.000000 p2=-23.000000   Final=-130483032.000000
p1=-130483032.000000 p2=-24.000000   Final=-130483056.000000


我为这个错误的结果而疯狂。只有一个求和运算符和三个变量,但是我的代码给出了错误的输出。
我已经在Windows 10(MinGW)和linux(gcc)中编译并运行了我的代码。

我真的对这个问题迷失了。
任何建议将不胜感激。

最佳答案

这是舍入误差或精度/精度问题,请参见。 https://en.wikipedia.org/wiki/Floating_point#Accuracy_problemshttps://en.wikipedia.org/wiki/Machine_epsilon,...)

也许尝试使用double代替float

对于任意精度,您可以使用特殊的库,例如MPFR(http://www.mpfr.org/

关于c - C代码中的错误总和结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48141351/

10-17 01:27