您的消息表明负数会给您带来麻烦。只需忽略该数字为负数,而是转换为1.25。然后翻转最高位将为您提供-1.25 的结果。浮点数这样很好:要取反,你需要做的就是翻转顶部。
详细信息:请记住,单精度数有 32 位。符号 1 位,指数 8 位,有效位 23 位。对于“正常”数字,有一个隐含的 1,即值为:
(-1)^s * 1.significand * 2^exponent
(1.significand 中的 1 是“隐式”1。)
您需要弄清楚您的号码需要为s、exponent 和significand 位分配什么;这样上面的公式就等于您要表示的数字。 (更准确地说:“最接近”它,因为由于基数原因,并非所有数字都可以准确表示,因此您必须四舍五入。)
签名位很简单:我们知道它将是1,因为您的号码是负数。
然后是 8 位的指数。这可以通过找出 2 的幂在您的数字“正下方”来找到。在这种情况下2^0 = 1 < 1.75 < 2 = 2^1,因此最接近的幂是 0。IEEE 存储偏差为 127 的指数,这意味着它将存储 E+127,而不是 E。 (这样做有充分的理由,很容易用谷歌搜索。)所以,指数将是 0+127 = 127,或01111111。
然后是 23 位有效位。对于普通数字,有一个隐含的1;这意味着您需要简单地以 23 位表示 0.25。嗯,这很简单:在 dot 次幂从 1 开始变为负数之后,010...0 就可以了,因为0*2^-1 + 1*2^-2 = 1/4 = 0.25。
将所有内容放在一起,您最终会得到:10111111101000000000000000000000。打印得很漂亮,这是:
ENCODED = -1.25 :: Float
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------S23----------
Binary layout: 1 01111111 01000000000000000000000
Hex layout: BFA0 0000
Precision: Single
Sign: Negative
Exponent: 0 (Stored: 127, Bias: 127)
Classification: FP_NORMAL
Binary: -0b1.01
Octal: -0o1.2
Decimal: -1.25
Hex: -0x1.4
Rounding mode: RNE: Round nearest ties to even.
Note: Conversion from "-1.25" was exact. No rounding happened.