为什么frexp / ldexp有效范围从[0.5,1.0]?

时间:2015-08-29 06:08:15

标签: c floating-point ieee-754 c-standard-library

为什么当IEEE 745浮点值实际上具有范围为[1.0,2}的有效位数时,frexp / ldexp函数的有效位数范围为[0.5,1.0]?

1 个答案:

答案 0 :(得分:0)

对于任何非0或非正规的有效浮点值,尾数的高位始终为1. IEEE-754通过不将其编码为二进制值来利用这一点,从而挤出一个额外的精度。像 double 有53位精度但只编码52.所以编码值永远不会小于1,范围是[1.0 .. 2)

但是只要需要实际值,就像printf()或需要完成计算一样,那么需要从编码值中恢复该位。通常在处理器的浮点执行单元内部完成。否则,英特尔x87 FPU设计臭名昭着的80位内部格式背后的灵感。所以实际范围是[0.5 .. 1)。 frexp函数与实际值一起使用。