【发布时间】:2010-11-23 03:12:00
【问题描述】:
给定一个标准化浮点数 f,f 之后/之前的下一个标准化浮点数是什么。
通过位旋转,提取尾数和指数我有:
next_normalized(double&){
if mantissa is not all ones
maximally denormalize while maintaining equality
add 1 to mantissa
normalize
else
check overflow
set mantissa to 1
add (mantissa size in bits) to exponent.
endif
}
但不是这样做,可以用浮点运算来完成吗?
作为
std::numeric_limits<double>::epsilon()
只是“邻域”为 1 的误差差异。-例如:
normalized(d+=std::numeric_limits<double>::epsilon()) = d for d large
似乎更多的是错误率而不是错误差异,因此我的天真直觉是
(1.+std::numeric_limits<double>::epsilon())*f //should be the next.
还有
(1.-std::numeric_limits<double>::epsilon())*f //should be the previous.
特别是我有 3 个问题,是否有人做过以下任何一项(针对 IEEE754):
1)对这个问题做了错误分析吗?
2)证明(或可以证明)对于任何 标准化双 d
(1.+std::numeric_limits<double>::epsilon())*d != d ?
3)证明对于任何规范化双数 d 不存在双 f 使得
d < f < (1.+std::numeric_limits<double>::epsilon())*d ?
【问题讨论】:
标签: floating-point