【问题标题】:Binary Addition IEEE format二进制加法 IEEE 格式
【发布时间】:2016-06-17 03:45:15
【问题描述】:

我正在尝试理解单精度 IEEE 格式的二进制加法。

例如,考虑案例

2^-20 + 2^-17

如何添加它们?我是否应该先将它们转换为十进制的 10 次方并这样做?但是我又得到了 9 位数字,因为计算机可以代表 7 位数字,我该如何摆脱另外两个数字?那么加法会是怎样的呢?任何阅读材料也会非常有用。

【问题讨论】:

    标签: floating-point precision scientific-computing


    【解决方案1】:

    找到解释数据格式的好来源。

    从这两个数字中提取一位符号、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 位,并将符号、指数和尾数组合成一个结果。

    【讨论】:

    • 嗯,非常感谢您的回答?但是我该如何继续找到相对错误呢?
    • @user2792941:与计算相对误差的方式相同:abs((approximate_value - exact_value) / exact_value)。如果您不清楚如何计算相对误差,我建议将math.stackexchange.com 作为更合适的位置。
    • 这个答案缺少有关如何使用适当的舍入模式(例如,round-ties-to-even 或其他)舍入到 24 位的所有详细信息,并且还缺少关于次正规的详细信息.真的,我不认为有一个很好的方法可以用 SO 格式回答这个问题,除非我们在某个地方给出一个包含所有细节的单一规范完整答案。当这些东西在许多其他地方都有记录时,这似乎是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多