为什么浮点表示使用符号位而不是2的补码来表示负数


20

考虑一个定点表示形式,可以将其视为浮点数的退化情况。负数完全可以使用2的补码。但是,为什么浮点数需要一个符号位,尾数位不应该使用2的补码?

同样,为什么指数位使用偏差而不是有符号的幅度表示(类似于尾数位)或2的补码表示?

更新:对不起,如果我不清楚。我一直在寻找浮点表示形式是如何成形的。如果在替代方案之间没有强大的实现权衡,那么有人可以解释浮点表示的历史方面吗?

Answers:


7

当所讨论的两个实体具有相同的“单位”和相同的“宽度”时,二进制补码才有意义。宽度是指,如果要添加N位和M位(其中N和M不同),则最好不要使用二进制补码。对于浮点数,我们有单位问题:如果指数不同,那么我们就在思维上移动了一个尾数,现在我们遇到了与以前相同的问题(宽度)。

对于指数位,通过使用偏置而不是符号+幅值,我们可以再获得一个值(否则,我们将获得+0和-0)。在这里,二元补码在乘或除数时是有意义的(因为此后我们要对指数进行加法或减法),但在加法或减法时意义不大。

编辑:评论者指出,可以使用符号扩展名添加长度不同的二进制补码整数。检测溢出也存在一些问题,但这也是可以解决的。总之,如果您足够小心的话,可以使用二进制补码。(您还需要处理乘法和除法。)


4
“如果您要添加一个N位和一个M位,其中N和M不同,那么最好不要使用二进制补码” –您能否澄清一下?我相信完全有可能使用MSB的2的补码表示来对数字进行扩展,例如4'b1111将扩展为5'b11111,而4'b0111-> 5'b00111。将其添加到浮点算术逻辑中的现有桶形移位器上不是很简单吗?
koo 2012年

谢谢您的回答!我已经编辑了问题,因此它可以更清楚地询问当前浮动点的构成要素。
koo 2012年

4

从维基百科:

二进制补码系统的优点是加法,减法和乘法的基本算术运算与无符号二进制数的运算相同...

二进制补码是一种表示负数的,只是恰巧是非常方便的。那就是完全使用它的全部理由。

尾数指数对表示浮点数。在大多数情况下,使用浮点数时,您不会仅对尾数或对指数进行算术运算。


4

但是为什么浮点数需要符号位

错误的假设。没必要 我很确定我已经遇到了使用2补码作为尾数的浮点格式,但是我必须要找出名称。

我并不是数值分析方面的专家,但我知道对他们来说零符号很重要。它可能比人的补语容易操纵。这可能是选择IEEE-754的标准。

还有为什么指数位使用偏差而不是有符号的幅度表示

同样,这是不需要的,有些则做了不同的事情。

它是一种表示形式,对于在指数上完成的一组操作更易于执行硬件实现(这里不希望有-0的表示形式)。

该选择的结果之一是,如果您不关心NaN,则可以使用有符号整数比较来比较FP数,这也许是某些条件的标准(事实上NaN需要特殊处理,这使我怀疑它不是适用于IEEE-754)。


有符号整数比较会将负FP编号向后排序。对他们来说,排名正确,某种补码格式的也有必要,用的补可能是最好的(负一会... ... 110.1111,与无限者的左右)。
2015年

3
MIL-STD-1750A可能是使用最广泛的处理器体系结构,用于指定二进制补码浮点表示形式。在第4.1节中:“指令集应以2的补码形式支持16位固定点单精度,32位固定点双精度,32位浮点和48位浮点扩展精度数据。 ”(强调我的) 。
njuffa '16

2

IEEE 754使用符号/幅度,而不是二进制补码或一个补码。

二进制补码具有正负范围不相同的缺点。如果所有位模式均有效,则您将拥有数字x,因此无法轻松计算-x。那很糟。另一种选择是存在无效的位模式,这也是不好的。在IEEE 754中,没有64位或32位浮点的无效位模式,因此您不必担心。

一个补码会使乘/除变得更复杂(对于带符号的幅度,您只需对符号进行异或运算,并将尾数视为无符号数字)。对于加法和减法,我真的不想考虑加法和减法,这会使我的头部受伤。


该答案的第一段表明,符号/幅度没有缺点。符号/幅值具有+/- 0且比二进制补码更复杂的算术。
Praxeolitic

+/-零既是一个问题,也是一个功能。例如,将一个很小的数字x除以10 ^ 100将得到+0或-0,并保留x的符号。
gnasher729


1

我认为了解浮点计算产生的是近似值,而不是精确值很重要。也就是说,如果浮点计算得出的编码值为X,则表示理论上理想的值,该值几乎可以肯定不是X,而是在[X .. X + e){机器epsilon”,即X和X + e}之间没有浮点数。更具体地,浮点零表示理想数字,该理想数字可能不完全为零,但是太小而无法用非零浮点编码值表示。

鉴于此,使用正负号表示是一种允许编码准确“记住” 理想值在哪一侧(正值或负值)的方法。这对于某些复杂的(在“ a + bi”意义上的)计算非常关键-复杂->复杂函数通常是“多值”的,因此对于正确的计算,至关重要的是要注意“分支切割”的位置。有符号的零在某种意义上标记了这些分支切割的位置-在正侧进行的计算将与负侧进行的计算不同。


1
浮点计算产生精确值。它们与数学实数产生的值略有不同。浮点数表示一个数字,而不是范围。
gnasher729

0

大多数浮点格式都利用了以下事实:在二进制系统中,任何具有非最小指数的非零值都将以“ 1”作为尾数的最高有效位。因此,在具有23位字段的尾数的系统中,正数尾数的范围从0到8,388,607,而从8,388,608到16,777,215。可能为正数或不为正数的尾数范围为-16,777,215至-8,388,608和+8,388,608至+16,777,215。当需要使计算“平滑地”越过零时,二进制补码是最好的数值格式,但尾数值的不连续范围意味着无论使用补码还是其他方式,计算都无法在零上平稳运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.