所以我一直在关注IEEE754浮点数双倍.(我的C++编译器将该类型用于a double).
请考虑以下代码段:
// 9007199254740992 is the 53rd power of 2.
// 590295810358705700000 is the 69th power of 2.
for (double f = 9007199254740992; f <= 590295810358705700000; ++f){
/* what is f?*/
}
Run Code Online (Sandbox Code Playgroud)
f由于四舍五入,推测可能会增加到第二次的第54次方的步数?
之后,由于四舍五入没有任何反应?
那是对的吗?它甚至定义明确吗?
正如评论中指出的那样,f++ 与 f = f + 1 相同,并且正如我自己测试的那样,f == f+1 (!!) 对于依赖于平台的大 f 。解释在这里(对于小数字,但原理是相同的)http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BinMath/addFloat.html
以下是如何添加浮点数。
首先,将这两种表示形式转换为科学记数法。因此,我们显式地表示隐藏的 1。为了相加,我们需要两个数字的指数相同。我们通过重写 Y 来实现此目的。这将导致 Y 未标准化,但值等于标准化的 Y。将 x - y 添加到 Y 的指数。将尾数(尾数)Y 的小数点向左移动 x - y 以补偿指数的变化。将 X 和调整后的 Y 的两个尾数相加。如果上一步中的和在小数点左侧没有一位值 1,则调整小数点和指数,直到出现为止。转换回一字节浮点表示形式。
在将数字转换为相同指数的过程中,由于精度原因,1 被舍入为 0,因此 f == f + 1。
根据 IEEE754,在求和之后,数字将被舍入以匹配双精度格式,并且由于舍入操作,f==f+1。
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |