【发布时间】:2016-06-17 03:45:15
【问题描述】:
我正在尝试理解单精度 IEEE 格式的二进制加法。
例如,考虑案例
2^-20 + 2^-17
如何添加它们?我是否应该先将它们转换为十进制的 10 次方并这样做?但是我又得到了 9 位数字,因为计算机可以代表 7 位数字,我该如何摆脱另外两个数字?那么加法会是怎样的呢?任何阅读材料也会非常有用。
【问题讨论】:
标签: floating-point precision scientific-computing
我正在尝试理解单精度 IEEE 格式的二进制加法。
例如,考虑案例
2^-20 + 2^-17
如何添加它们?我是否应该先将它们转换为十进制的 10 次方并这样做?但是我又得到了 9 位数字,因为计算机可以代表 7 位数字,我该如何摆脱另外两个数字?那么加法会是怎样的呢?任何阅读材料也会非常有用。
【问题讨论】:
标签: floating-point precision scientific-computing
找到解释数据格式的好来源。
从这两个数字中提取一位符号、8 位指数和 23 位存储尾数。
如果任何指数为 0xff,则该数字为 NaN(如果存储的尾数非零)或 Infinity(如果存储的尾数为 0)。查找在涉及 Infinity 和 NaN 的所有情况下您应该返回的结果并返回该结果。完毕。
除非指数为 0(零或非规格化数字),否则在尾数的第 23 位添加隐式前导 1 位,从而为您提供正确的 24 位尾数。
比较指数。将具有较小尾数的数字向右移动正确的位数,但要跟踪所有移出的位。
根据符号添加或减去尾数,包括移出的位。
如果尾数和所有移出的位都为零,则结果为 +0 或 -0。检查 IEEE 规则以找到哪一个。只有 (-0) + (-0) 给出 -0,其他的都是 +0。完毕。
如果设置了尾数的第 24 位,则将结果右移并将指数增加 1。
只要尾数的第 23 位清零且指数不为零,则将结果左移并将指数减 1。
如果您移出尾数的最高位已设置,并且如果移出更多位或尾数的最低位为 1,则尾数加 1,如果位 24 为设置然后将其向右移动 1 位并增加指数。
如果指数为 0xff,则结果为 +Infinity 或 -Infinity。完毕。
否则清除尾数的第 23 位,并将符号、指数和尾数组合成一个结果。
【讨论】:
abs((approximate_value - exact_value) / exact_value)。如果您不清楚如何计算相对误差,我建议将math.stackexchange.com 作为更合适的位置。