为什么Float16(1.1)-Float16(1)=Float16(0.0996)?

Gov*_*nor 4 julia

我正在尝试手工计算Float16(1.1)-Float16(1)。由于 Float16 允许分数使用 10 位,因此当我以 10 位精度手动进行减法时,我不会得到 0.0996。

有人可以指导我如何使用这些位进行减法吗?

cbk*_*cbk 6

bitstring似乎评论已经回答了您的问题,但对于其他人来说,添加您可以轻松检查实际位模式以查看在这种情况下发生的情况可能会很有用:

julia> bitstring(Float16(1.1))
"0011110001100110"

julia> bitstring(Float16(1.0))
"0011110000000000"

julia> bitstring(Float16(1.1)-Float16(1.0))
"0010111001100000"
Run Code Online (Sandbox Code Playgroud)

其中位划分如下

IEEE 754 半精度格式

作为参考,注释中引用的“隐式位”解释如下

假定该格式具有值为 1 的隐式前导位,除非指数字段存储为全零。因此,内存格式中仅出现 10 位有效数,但总精度为 11 位。

  • 以下是将位串片段转换回 Float16 的公式,以防对其他人有帮助: `Float16(-1)^Float16(0b0) * Float16(2)^(Float16(0b01011)-Float16(15)) * (Float16(1) + Float16(0b1001100000) / Float16(1024))` => `Float16(0.0996)` (2认同)