【发布时间】:2013-09-12 02:04:38
【问题描述】:
我已经阅读了一些已经分解双打并“将其组合在一起”的主题,但我正在尝试将其分解为它的基本组件。到目前为止,我已经确定了一点:
breakDouble( double d ){
long L = *(long*) &d;
sign;
long mask = 0x8000000000000000L;
if( (L & mask) == mask ){
sign = 1;
} else {
fps.sign = 0;
}
...
}
但我对如何获得指数和尾数感到很困惑。我没有强迫双倍长,因为只有前导位很重要,所以截断没有发挥作用。但是,对于其他部分,我认为这不会起作用,而且我知道您不能对浮点数执行按位运算符,所以我被卡住了。
想法?
编辑:当然,我一发帖就找到this, but I'm not sure how different floats and doubles are in this case.
编辑 2(抱歉,我正在工作): 我阅读了我在编辑 1 中链接的那篇文章,在我看来,我可以以同样的方式执行他们在我的替身上所做的操作,带有掩码的指数是:
mask = 0x7FF0000000000000L;
对于尾数:
mask = 0xFFFFFFFFFFFFFL;
这对吗?
【问题讨论】:
-
L 中有位,因此您可以对其进行位操作。得到你想要的只是掩饰和转移的问题。我忘记了偏移量和偏移量是什么。
-
是的,但我不是通过将替身的准确性“破坏”为长吗?
-
嗯,已经有一个函数可以做到这一点:
frexp. -
@RaymondChen:
frexp做的事情略有不同。当出现 NaN、无穷大和次正规时,它的行为是合理的,因此它比 bit-hacky 方式要慢。