具有相同值的两个变量的差值产生非零结果

Difference of two variables having same values yields non-zero result

提问人:bubucodex 提问时间:4/6/2023 最后编辑:bubucodex 更新时间:4/6/2023 访问量:112

问:

我正在尝试用 C 语言计算数学表达式。表达式如下:enter image description here

以下是我编写的用于计算数学表达式的代码:

int main()
{  
    
     double x,y,A1,B1,C1,result;

     x = 8.1500e-07;
     y = 7.9714e-08;

     A1 = (1-exp(-2*x))/(2*x);
     B1 = 2/(x*( 1 + pow((y/x),2)) );
     C1 = 1 - ( exp(-x)*( cos(y) - (y/x)*sin(y) ));
    
     result = 1 + A1 - B1*C1;
     
     printf("1 + A1 = %e\n",1+A1);

     printf("B1*C1 = %e\n",B1*C1);

     printf("result = %e\n",result);

     


}

当单独计算时,1+A1 似乎被评估为 等于 B1 C1,但 1+A1-B1 C1结果证明是一个非常小的负值。结果如下: Outcome of the C program shown above.我想知道我是否可以将其视为计算中的一些错误,类似于实验中的错误,并安全地认为结果为零?或者,我错过了什么?

c 精度 数学表达式

评论

4赞 Gerhardh 4/6/2023
这回答了你的问题吗?浮点数学坏了吗?
0赞 Ture Pålsson 4/6/2023
请注意,默认情况下,打印 6 位小数。如果提高精度,您会注意到这两个项实际上略有不同,这解释了非零差异。现在,这种差异是实际的、数学上的差异还是浮点误差的产物(正如 Gerhardh 在另一条评论中指出的那样),我甚至懒得去找出答案。%e
0赞 bubucodex 4/6/2023
您能评论一下我怎样才能发现这是否真的是数学差异@TurePålsson吗?
2赞 Ian Abbott 4/6/2023
您可以通过将 1-exp(X) 替换为 -expm1(X) 来提高浮点计算的准确性。
0赞 Ian Abbott 4/6/2023
您也可以将其替换为 ,以略微提高准确性。1 + A1 - B1*C1fma(-B1, C1, 1 + A1)

答:

3赞 KamilCuk 4/6/2023 #1

这些值与第 6 位小数相同并不意味着它们相同。

 printf("1 +A1 = %.20e\n",1+A1);
 printf("B1*C1 = %.20e\n",B1*C1);

指纹:

1 +A1 = 1.99999918502629325801e+00
B1*C1 = 1.99999918503684992466e+00