对于计算任何给定双值的实平方根的问题,编程访谈元素的作者提出solution,其中2个双值a
和{{1}之间的差异计算如下:
b
我的问题是:
除以typedef enum { SMALLER, EQUAL, LARGER } Ordering;
Ordering Compare(double a, double b) {
// Uses normalization for precision problem.
double diff = (a - b) / b;
return diff < -numeric_limits<double>::epsilon()
? SMALLER
: diff > numeric_limits<double>::epsilon() ? LARGER : EQUAL;
}
的重点是什么?这如何解决“精确问题”?
我完全不理解b
的重要性;最小值的概念大于1.为什么它在epsilon()
开始时有自己的常量?
答案 0 :(得分:1)
除以b
的重点是什么
数字由尾数和指数(和符号,sqrt为正)组成。 sqrt
函数将指数除以2并从尾数得到平方根。例如,sqrt(4e20)== 2e10; sqrt(4e-100)== 2e-50,依此类推。考虑到IEEE754的两倍,它们的绝对误差分别接近1e-7和1e-67。因此,任何固定的绝对误差对于比较迭代都是无用的;只有相对错误才有意义。除以b
将近似绝对误差转换为相对误差。
可以使用另一种方法:将源值分成小值(例如1到4之间)和指数的乘积;后者将在最终时恢复到sqrt
结果。利用这种“标准化”输入值,可以将顺序根近似值与绝对误差进行比较。
我完全不理解epsilon()的意义;最小值大于1的概念。
不是“最大值大于1”,而是1与前者之间的差异。
在此处使用epsilon
表示近似值是理想舍入值中最接近的两个之一(更小和更大)。这比检查案例精度不会增加更简单,但近似值落入永恒循环。
答案 1 :(得分:-1)
以下帖子可能会让您清楚了解为什么需要进行epsilon比较:https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/