0

我知道科学记数法,但我不确定那个数字 ( -1.58839967e+038) 的确切含义。

它应该非常接近 0,但它说它e+038看起来像-1.5 * 10 ^ 38(因为有一个+

有人可以帮我解释一下这个意思吗?谢谢。

4

3 回答 3

6

是的,-1.58839967e+038大约是 -1.588×10 38,一个很大的负数。它恰好是通常以类型表示的最大值的 47% 左右,float但这可能不相关。

用英语表示,它大约是 -158.8 undecillion,除非你在做大规模的天体物理学,否则这个数字可能特别有意义。

如果它存储在 类型的对象中float,假设典型的 IEEE 32 位表示,那么它的表示恰好等于0xfeeefeee,这看起来很可疑。

这是一个演示这一点的程序:

#include <stdio.h>
int main(void) {
    union {
        float f;
        unsigned int u;
    } u;
    if (sizeof (float) != sizeof (unsigned int)) {
        puts("WARNING: float and unsigned int differ in size");
    }
    u.f = -1.58839967e+038;
    printf("0x%x\n", u.u);
}

输出是:

0xfeeefeee

谷歌搜索“FEEEFEEE”出现了一篇关于“幻数”的维基百科文章,其中包括以下内容:

费用

“费用”,微软的 debug HeapFree() 用来标记释放的堆内存。一些附近的内部簿记值也可能将高字设置为 FEEE。

脚注指向http://www.nobugs.org/developer/win32/debug_crt_heap.html

于 2013-09-26T21:13:23.863 回答
1

当转换为十六进制时(使用这个站点),你可以看到这个值实际上是 0xFEEEFEEE。

根据这里的幻数列表:

FEEEFEEE :“费用”,由微软的 debug HeapFree() 用来标记释放的堆内存。一些附近的内部簿记值也可能将高字设置为 FEEE。

所以它可能是一个已删除的结构,或者内存溢出或类似的东西。没有您的代码,我无法准确判断。

于 2013-09-26T21:18:38.003 回答
0

as 显示的值-1.58839967e+038确实是以科学计数法的形式显示的。我相信这种用法E可以追溯到 FORTRAN,而且我个人在 1970 年代后期第一次遇到计算机时就已经看到了这种表示法的使用。

该数字几乎是可以用 IEEE-754 32 位(也称为单精度)二进制浮点值表示的最大可能负值。我不会将其描述为接近于零。

真正的最大量级是+/- 3.4028235E+38

这个计算器是一个很好的站点,它显示了构成浮点值的位的详细存储和排列。从中可以看出,您命名的值作为 32 位值存储在内存中0xfeeefeed。该值并不像 那样可疑0xdeadbeef,但它确实看起来有点过于模式化,不能仅仅是计算的结果。

于 2013-09-26T21:13:45.077 回答