如何解释尾数中的隐藏位? MIPS 代码 IEEE-754
Posted
技术标签:
【中文标题】如何解释尾数中的隐藏位? MIPS 代码 IEEE-754【英文标题】:How to account for hidden bit in mantissa? MIPS code IEEE-754 【发布时间】:2018-06-09 17:41:32 【问题描述】:这是我只打印浮点尾数的代码。存储在 $t1 中的值是值 0xBEDCFFFF,它的尾数为 10111001111111111111111。我的代码在开头没有打印这个值。必要时如何编写子句以输入 1 或 0 的隐藏位?
li $t4, 1 # Reset counters
li $t3, 23
mantloop: # Loop to mask and print each bit
ble $t3, $t4, finish # escape clause
subi $t3, $t3, 1 # subtract from the counter
srl $t2, $t2, 1 # shifting mask
and $t0, $t1, $t2 # ANDing registers
bnez $t0, printOneee # Print one or zero
printZerooo:
li $v0, 1
li $a0, 0
syscall
j mantloop # loop reset
printOneee:
li $v0, 1
li $a0, 1
syscall
j mantloop # loop reset
finish: # method complete
【问题讨论】:
【参考方案1】:不清楚您所说的“帐户”是什么意思。如果要打印 IEEE754 浮点数的二进制表示,则隐含位不是其中的一部分。
如果你想要尾数所代表的实际值,你需要知道指数。
对于非正规数,尾数的隐式前导位为 0(当指数字段为零时)。否则,隐含位为 1。
https://en.wikipedia.org/wiki/Single-precision_floating-point_format。这包括+- 0.0
,由exponent=0 mantissa=0 表示。
如果您没有任何非正规化,那么前导位始终为 1。(但 0.0
被视为次正规化)。
https://www.h-schmidt.net/FloatConverter/IEEE754.html 很有用:对于任何输入位模式(十六进制)或十进制值(如 1.234),它分别显示位和指数/尾数。
+- 无穷大表示为指数=全1,尾数=0。它是无限的,隐含的位并没有真正的意义。
NaN 由指数=全一,尾数=非零(符号位 = 任一)表示。尾数是 NaN 的“有效载荷”,是任意的。只谈论实际存在的位才有意义,而不是隐含的位。
【讨论】:
IEEE 754 首选术语:“尾数”→“有效数”、“非正规”→“次正规”。 @EricPostpischil:甚至有一个令人信服的论点认为“尾数”不是一个合适的术语:en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22 指出“尾数”正确地指的是对数的小数部分,但有效数是线性的只有指数是对数的。在这个答案中,我决定不向那个风车倾斜,因为至少“尾数”不会造成任何混乱。至于“不正常”,我没有意识到这一点。是否有任何关于“非正常”实际上是错误的论点?非正规被广泛使用,例如x86 的 DAZ(非正规为零)标志。 @PeterCordes:我不记得为什么首选“次正规”,但我会冒险猜测任何数字都可以通过将其缩放为规范形式以外的其他形式来反规范化,并且发生了这种情况自然是在计算中间结果时(比如在结果归一化之前进行消减),所以“次正规”特指低于可以正常表示的范围的数字。 “......但尾数非零”的奇怪情况。printf("%d\n", isnormal(0.0));
在我的平台上报告 0。也许 0.0 是非正规/次正规的,不需要这种条件。 IAC,0.0 没有隐含的 1,因为可以阅读第 3 段。
@chux: 很好,零是次要的。我想我搞混了,因为设置 FTZ / DAZ 仍然会产生 0.0,我们通常不认为它很奇怪。我想这是唯一不奇怪的次常态。 :P 更新并添加了 +-Inf(其中尾数 = 0 与 NaN 区分开来)以上是关于如何解释尾数中的隐藏位? MIPS 代码 IEEE-754的主要内容,如果未能解决你的问题,请参考以下文章