C代码中的错误求和结果

C代码中的错误求和结果,c,C,一个操作符似乎在我的C代码中产生错误的结果。 首先,以下是我在代码中声明变量的行(在主函数、常规范围之外): 然后,我调用一个函数,该函数按顺序执行下面几行代码: p1=FinalEnergy; p2=EnergyState; FinalEnergy=FinalEnergy+EnergyState; fprintf(fenergy,"p1=%f p2=%f Final=%f",p1,p2,FinalEnergy); 使用以下函数可正确启动文件“fenergy”: fenergy=fope

一个操作符似乎在我的C代码中产生错误的结果。 首先,以下是我在代码中声明变量的行(在主函数、常规范围之外):

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

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 
我对这个错误的结果越来越着迷。只有一个求和运算符和三个变量,但我的代码给出了错误的输出。 我已经在Windows10(MinGW)和linux(gcc)中编译并运行了我的代码

我对这个问题真的很迷茫。
如有任何建议,将不胜感激

这是舍入误差或精度/精度问题,参见(,…)

可能尝试使用
double
而不是
float


对于任意精度,您可以使用特殊的库,如MPFR()

您意识到您只使用32位
float
变量,对吗?因此,看起来您正在失去一些精度。为什么不改用64位
double
变量呢?我个人从来没有在C中使用过
float
。请发布显示问题的。在问题中以文本形式显示输入、预期输出和实际输出。旁白:除非有充分的理由不能使用
double
,否则不要使用较低的
float
float
值具有24位精度,约为7位小数精度。你期望的是9位数的精度。改为使用
double
值(53位=~16位精度)。用双变量替换浮点解决了问题。谢谢你的帮助!
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