C 和 Matlab 的指数限制

Exponential limits for C and Matlab

提问人:Leo 提问时间:6/2/2023 更新时间:6/8/2023 访问量:68

问:

在计算机中,浮点数的数学运算实际上是分别使用基数和指数数进行处理的,然后将它们组合在一起。我们在计算基础教科书中学到了这一点。但是,我发现 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 MATLAB 浮动精度 数字

评论

3赞 user3386109 6/2/2023
尝试使用 而不是在 C 程序中。doublefloat
0赞 user3386109 6/2/2023
通常,C 程序使用 IEEE-754 格式32 位浮点值和 64 位双精度值,因此您可能需要阅读相关内容。
0赞 Steve Summit 6/2/2023
@user3386109是对的。除非你有特殊需求并且知道自己在做什么,否则永远不要使用 C 语言中的类型;始终使用 .floatdouble
1赞 Steve Summit 6/2/2023
1e-50 对于类型来说太小了,无法表示。您可以在 a 中表示的最大数字约为 1e38,最小约为 1e-45。floatfloat
0赞 Steve Summit 6/2/2023
请注意,C(或几乎任何传统编程语言)只有有限精度的浮点类型,与MATLAB或Mathematica等程序相比,这些浮点类型本身将具有更多的限制(精度和范围)。你说你的工作涉及“小数计算”。类型通常会为您提供 1e-307 到 1e307 的有用范围(如果包含次正常值,则降至 1e-324),但如果您需要比这更好的范围,您可能需要查看专门的库。double

答:

4赞 Cris Luengo 6/2/2023 #1

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

在C语言中,是单精度浮点数,是双精度浮点数。floatdouble

MATLAB 默认使用,但也用于单精度浮点数。doublesingle

如果您在 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 结果。doublefloat