我正在与非规范化数字作斗争。
我知道:
本质上,非规范化浮点数能够表示 可以用以下表示的最小(大小)数字 任何浮点值。
我也知道数字可以这样表示:
但是我陷入困境的是去/标准化数字的实际计算?
有没有办法做到这一点?有什么特殊的数字吗?
非常感谢您的回答!
“次正常”是 IEEE 754 标准中使用的术语。
不存在大于 1 的次正规数;次正规数很小(比正规数更小)。
最小正常指数为-1022(编码为位00000000001,因为指数编码有1023的偏差)。次正规数有较低的指数编码,编码为全零位00000000000。(虽然编码为0,但其表示的指数与编码1相同,-1 1022。指数编码0表示有效数的前导位为0而不是 1。)
次正规数的值是尾数(小数部分)乘以 2-1022,并应用符号位(0 表示正数,1 表示负数)。尾数由前导 0 组成,然后是小数点“.”,然后是尾数字段的位。因此,如果有效数字字段包含 0101010101010101010101010101010101010101010101010101,则有效数字值为(二进制) 0.01010101010101010101010101010101010101010101010101012.
如果有效数字段完全为零,则该值为零,并且该数字通常不被认为是次正规的。最小的正次正规数的最低位为 1,所有其他位均为 0。其值为 0.00000000000000000000000000000000000000000000000000012•2-1022,即 2-52•2-1022 = 2-1074.
这是我几年前写的一些 Perl 代码。不幸的是,我不再记得这些确切数字的来源:
我们的$POS_NORM_SMALLEST = 2.22507385850720138e-308; # 可能的最小标准化正 IEEE 64 位浮点值
我们的$POS_DENORM_SMALLEST = 4.94065645841247e-324; # 最小可能的非规范化(次正规)正 IEEE 64 位浮点值