提问人:Leo 提问时间:6/2/2023 更新时间:6/8/2023 访问量:68
C 和 Matlab 的指数限制
Exponential limits for C and Matlab
问:
在计算机中,浮点数的数学运算实际上是分别使用基数和指数数进行处理的,然后将它们组合在一起。我们在计算基础教科书中学到了这一点。但是,我发现 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语言中做到这一点吗?
答:
4赞
Cris Luengo
6/2/2023
#1
在大多数语言中,您至少可以使用两种浮点类型:单精度和双精度。
在C语言中,是单精度浮点数,是双精度浮点数。float
double
MATLAB 默认使用,但也用于单精度浮点数。double
single
如果您在 MATLAB 程序中使用值,您将执行与 C 程序相同的计算,并产生相同的结果:single
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 程序以使用 而不是 ,以准确重现 MATLAB 结果。double
float
评论
double
float
浮点
值和 64 位双精度
值,因此您可能需要阅读相关内容。float
double
float
float
double