math - 如何减去两个正的 IEEE-754 数字?
问题描述
所以我有点无奈。我想我了解如何对 IEEE-754 数字进行加法运算,但减法运算存在很大问题。我有感觉,我的想法是正确的,但我想和你们核实一下。
所以我们有以下两个 IEEE-754 编号:
x: 0 1000 0010 100 1000 0000 0000 0000 0000
y: 0 1000 0011 010 1001 0000 0000 0000 0000
由于我们必须得到正数并且我们想减去它们,我的想法是取 y,反转尾数并计算
x+(-y)
一位导师告诉我,那是不正确的,我必须保持数字为正,然后减去它们。为什么以及如何他没有告诉我。
有人能告诉我这样做的正确方法是什么吗?
我对 xy 方式的想法:
- 将指数从 x 扩展到 1000 0011
- 将 x 的尾数移动 1
- 以正常方式减去两个数字
解决方案
OP 的 1-2-3 想法大部分都在轨道上,但可能错过了隐含的一点。
1 考虑隐含位。
s eeee eeee mmm mmmm mmmm mmmm mmmm mmmm
x: 0 1000 0010 100 1000 0000 0000 0000 0000
y: 0 1000 0011 010 1001 0000 0000 0000 0000
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm
x: 0 1000 0010 1100 1000 0000 0000 0000 0000
y: 0 1000 0011 1010 1001 0000 0000 0000 0000
2 调整较小的数值,形成一个共同的指数。(增量博览会,转移“尾数”)
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm extra bits
x: 0 1000 0011 110 0100 0000 0000 0000 0000 0
y: 0 1000 0011 1010 1001 0000 0000 0000 0000
2.5 如果符号位不同,翻转第二个并执行加法。然而,由于在这种情况下相同,没有太多可做的。
3 从大中减去小。
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm
y: 0 1000 0011 1010 1001 0000 0000 0000 0000
x: 0 1000 0011 110 0100 0000 0000 0000 0000 0
d: 0 1000 0011 0100 0101 0000 0000 0000 0000 0
4 调整使 MSbit 为隐含的 1(移位“尾数”,递减指数)。
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm
d: 0 1000 0010 1000 1010 0000 0000 0000 0000
5 考虑反向减法。(翻转标志)
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm
d: 1 1000 0010 1000 1010 0000 0000 0000 0000
6 轮 - 在这种情况下没有值变化。
s eeee eeee immm mmmm mmmm mmmm mmmm mmmm
d: 1 1000 0010 1000 1010 0000 0000 0000 0000
7 删除隐含位以形成编码结果。
s eeee eeee mmm mmmm mmmm mmmm mmmm mmmm
d: 1 1000 0010 000 1010 0000 0000 0000 0000
为简洁起见,省略了非数字、次法线、溢出、无穷大和舍入的详细信息。
注意 IEEE-754 使用“显着”,而不是“尾数”。
推荐阅读
- python-3.x - 为什么 Qt 中的字体看起来模糊或像素化?
- javascript - 可读流得到一个 blob
- machine-learning - 逻辑回归可以用于包含列表的变量吗?
- c++ - “断言(this)”是一种可行的模式吗?
- gcc - 什么是 __XSI_VISIBLE?
- python - FileNotFoundError 但文件在目录中
- firebase - 错误:3 INVALID_ARGUMENT:位置必须等于 europe-west1,因为与此项目关联的 App Engine 应用位于 europe-west1
- c++ - 在 CLion 中设置 OpenMP 项目 MacOS Mojave
- powershell - 运行 .exe 以获取字符串输出不会保存到字符串变量
- python - 列表中元素的索引