IEEE 754 中的指数
Posted
技术标签:
【中文标题】IEEE 754 中的指数【英文标题】:Exponent in IEEE 754 【发布时间】:2010-02-14 21:47:07 【问题描述】:为什么浮点数中的指数被 127 取代了? 那么,真正的问题是:与 2 的补码表示法相比,这种表示法有什么优势?
【问题讨论】:
【参考方案1】:由于存储的指数是无符号的,因此可以使用整数指令来比较浮点值。整个浮点值可以被视为有符号幅度整数值以进行比较(而不是二进制恭维)。
【讨论】:
如果我们使用 2 的补码符号,它的工作方式会不会一样? 这不是真的。两个负浮点值不能正确地作为有符号整数进行比较。所有其他情况都正常工作。 @Stephen:是的,没错,浮点数可以作为有符号幅度整数进行比较,而不是二进制补码整数,符号位需要一些特殊情况处理。 “整个浮点值可以被视为有符号整数值”绝对是不正确的。考虑改变答案? @Potatoswatter:我更改/澄清了答案【参考方案2】:只是为了纠正一些错误信息:它是2^n * 1.mantissa
,分数前面的 1 被隐式存储。
【讨论】:
你对我的回答投了反对票吗?这不是错误信息。 1 仅隐式存储指数 > -126,但 0 隐式存储 -126。它被称为“非规范化数字”。 我没有否决你的答案,但你的答案基本上仍然是误导/不正确的。您提到 2^-126 * 0.mantissa,但如果指数为 -126,则指数+偏差 = 1,因此它不是非规范化数字,因此隐式存储 1。你也只提到“小数字”,那么截止点在哪里? 指数 -127 和 128(二进制 0 和 255)是小数(包括 +-0)和无限/NaN 的特殊范围。对于二进制 1,公式是+- 2^-126 * 1.mantissa
,但对于二进制 0,公式是 +- 2^-126 * 0.mantissa
,导致数字范围一致。我猜“截止”是指最小的可表示(非零)数字? - 那将是尾数集的最后一位 = 2^-126 * 0.mantissa
= 2^-126 * 2^-23
的非规范化数字。我的回答中看不到任何不正确的地方。
我知道你所说的截止是什么意思,我只是说你的回答并不清楚截止。否则,我意识到我错了。我习惯于看到非规范化数字表示为 1 - (1 - 0.mantissa)(如 (1 - 2^-23) * 2^-126)。所以当我看到你的数字是 2^-126 * 0.mantissa 时,我以为你搞错了。【参考方案3】:
请注意,在有偏和 2 的补码之间,指数的可表示范围略有不同。 IEEE 标准支持 (-127 到 +128) 范围内的指数,而如果它是 2 的补码,它将是 (-128 到 +127)。我真的不知道标准选择偏差形式的原因,但也许委员会成员认为允许非常大的数字比允许非常小的数字更有用。
【讨论】:
IEEE 标准实际上支持从 -126 到 +127 的单精度指数;通常映射到 -127 和 +128 的指数编码具有特殊含义(零和非正规、无穷大和 NaN)。【参考方案4】:@Stephen Canon,回应 ysap 的回答(抱歉,这应该是对我的回答的后续评论,但原来的回答输入为一个未注册的用户,所以我还不能真正评论它)。
斯蒂芬,显然你是对的,我提到的指数范围是不正确的,但答案的精神仍然适用。假设如果它是 2 的补码而不是偏置值,并且假设 0x00 和 0xFF 值仍然是特殊值,那么偏置指数允许比 2 的补码指数大 (2x) 的数字。
【讨论】:
哦,我完全同意。在这里,有一些代表,所以你可以评论=)【参考方案5】:32 位浮点数中的指数由 8 位组成,但没有符号位。所以范围实际上是 [0;255]。为了表示
这样,可以非常精确地表示非常小的数字。对于 [0;255] 范围,小数字必须表示为 2^0 * 0.mantissa
,尾数中有很多零。但是对于 [-127;128] 范围,较小的数字更精确,因为它们可以表示为 2^-126 * 0.mantissa
(尾数中不必要的零较少)。希望你明白这一点。
【讨论】:
我相信他在问为什么使用偏移量而不是 2 的补码。 抱歉,不知道U2是什么意思。 嗯,我在某处找到了名称“U2”符号,我认为这是一些缩写:|现在当我用谷歌搜索时,我认为这是某种错误。显然我在考虑 2 的补码表示法。以上是关于IEEE 754 中的指数的主要内容,如果未能解决你的问题,请参考以下文章