在计算机中,浮点数的数学运算实际上是分别使用基数和指数数进行处理,然后将它们组合在一起.我们在计算基础课本中学到了这一点.然而,我发现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语言做到这一点呢?

推荐答案

在大多数语言中,您至少可以访问两种浮点类型:单精度和双精度.

在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结果.

C++相关问答推荐

C中空终止符后面的数字?

为什么下面的C代码会进入无限循环?

来自stdarg.h的c中的va_args无法正常工作<>

可以将C变量限制为特定的读/写速度吗?

为什么即使在强制转换时,此代码也会溢出?

如何在ASM中访问C struct 成员

GTK3按钮信号错误

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

防止C++中递归函数使用堆栈内存

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

在C中包装两个数组?

C语言中的数字指针

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

C:面筋蛋白';为什么不刷新窗口?

未为同一文件中的函数执行DirectFunctionCall

在C中定义函数指针?

c 中符号表缺少项目

对 getchar 函数和 EOF 感到困惑