英文:
Exponential limits for C and Matlab
问题
在计算机中,浮点数的数学运算实际上是分别处理基数和指数部分,然后将它们组合在一起。我们在计算基础教材中学到了这一点。然而,我发现在C程序和MATLAB中,限制值(limits)是不同的。下面是一个例子:
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中也能正确执行这种计算?
英文:
In computers, the math operation of floating numbers is actually processed using the base number and the exponential number separately, and then combine them together. We learn this in our computation fundamental textbooks. However, I find the limits in C program and MATLAB are quite different. Here is an example:
C program:
#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;
}
The running result is:
1.000000e-20,1.000000e-30,0.000000e+00
MATLAB program:
c1 = 1.0e-20;
c2 = 1.0e-30;
c3 = c1 * c2;
fprintf("%e,%e,%e\n",c1,c2,c3);
The running result is:
1.000000e-20,1.000000e-30,1.000000e-50
It is obvious that MATLAB gives the right multiplication result, whereas C gives a wrong result. Could anyone answer why this happens?
In my project, my computation involves such small number computations in C language. Since Matlab can do it correctly, can you give a suggestion how I can also do this in C?
答案1
得分: 4
在大多数编程语言中,您将至少可以访问两种浮点数类型:单精度和双精度。
在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的结果。
英文:
In most languages, you'll have access to at least two floating-point types: single-precision and double-precision.
In C, float
is a single-precision float, double
is a double-precision float.
MATLAB uses double
by default, but also has single
for single-precision floats.
If you use single
values in your MATLAB program, you'll do the same computation that your C program does, with the same result:
c1 = single(1.0e-20);
c2 = single(1.0e-30);
c3 = c1 * c2;
fprintf("%e,%e,%e\n",c1,c2,c3);
The output is:
1.000000e-20,1.000000e-30,0.000000e+00
Likewise, you can change your C program to use double
instead of float
, to reproduce the MATLAB results exactly.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论