C和Matlab的指数极限

x8goxv8g  于 2023-06-05  发布在  Matlab
关注(0)|答案(1)|浏览(136)

在计算机中,浮点数的数学运算实际上是分别使用基数和指数进行处理,然后将它们组合在一起。我们在计算基础教科书中学到了这一点。然而,我发现C程序和MATLAB中的限制是完全不同的。下面是一个例子:
C程序:

#include <stdio.h>

int main()
{
    float c1, c2, c3;
    
    c1 = 1.0e-20;
    c2 = 1.0e-30;
    
    c3 = c1 * c2;
    printf("%e,%e,%e\n",c1,c2,c3);

    return 0;
}

运行结果为:

1.000000e-20,1.000000e-30,0.000000e+00

MATLAB程序:

c1 = 1.0e-20;
c2 = 1.0e-30;
    
c3 = c1 * c2;
fprintf("%e,%e,%e\n",c1,c2,c3);

运行结果为:

1.000000e-20,1.000000e-30,1.000000e-50

很明显,MATLAB给出了正确的乘法结果,而C给出了错误的结果。有人能回答为什么会发生这种情况吗?
在我的项目中,我的计算涉及C语言中的小数值计算。既然Matlab可以正确地做到这一点,你能给予我一个建议,我如何也可以在C中做到这一点?

41zrol4v

41zrol4v1#

在大多数语言中,您至少可以访问两种浮点类型:单精度和双精度。
在C中,float是单精度浮点数,double是双精度浮点数。
MATLAB默认使用double,但也有single用于单精度浮点数。
如果在MATLAB程序中,你可以使用single值,你将执行与C程序相同的计算,并得到相同的结果:

c1 = single(1.0e-20);
c2 = single(1.0e-30);
c3 = c1 * c2;
fprintf("%e,%e,%e\n",c1,c2,c3);

输出为:

1.000000e-20,1.000000e-30,0.000000e+00

同样,您可以更改C程序以使用double而不是float,以准确地再现MATLAB结果。

相关问题