在计算机中,浮点数的数学运算实际上是分别使用基数和指数进行处理,然后将它们组合在一起。我们在计算基础教科书中学到了这一点。然而,我发现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中做到这一点?
1条答案
按热度按时间41zrol4v1#
在大多数语言中,您至少可以访问两种浮点类型:单精度和双精度。
在C中,
float
是单精度浮点数,double
是双精度浮点数。MATLAB默认使用
double
,但也有single
用于单精度浮点数。如果在MATLAB程序中,你可以使用
single
值,你将执行与C程序相同的计算,并得到相同的结果:输出为:
同样,您可以更改C程序以使用
double
而不是float
,以准确地再现MATLAB结果。