我知道科学记数法,但我不确定那个数字 ( -1.58839967e+038
) 的确切含义。
它应该非常接近 0,但它说它e+038
看起来像-1.5 * 10 ^ 38
(因为有一个+
)
有人可以帮我解释一下这个意思吗?谢谢。
我知道科学记数法,但我不确定那个数字 ( -1.58839967e+038
) 的确切含义。
它应该非常接近 0,但它说它e+038
看起来像-1.5 * 10 ^ 38
(因为有一个+
)
有人可以帮我解释一下这个意思吗?谢谢。
是的,-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
as 显示的值-1.58839967e+038
确实是以科学计数法的形式显示的。我相信这种用法E
可以追溯到 FORTRAN,而且我个人在 1970 年代后期第一次遇到计算机时就已经看到了这种表示法的使用。
该数字几乎是可以用 IEEE-754 32 位(也称为单精度)二进制浮点值表示的最大可能负值。我不会将其描述为接近于零。
真正的最大量级是+/- 3.4028235E+38
。
这个计算器是一个很好的站点,它显示了构成浮点值的位的详细存储和排列。从中可以看出,您命名的值作为 32 位值存储在内存中0xfeeefeed
。该值并不像 那样可疑0xdeadbeef
,但它确实看起来有点过于模式化,不能仅仅是计算的结果。