为什么规范化会在比较双精度时解决精度问题?

时间:2017-07-03 05:23:15

标签: floating-point precision ieee-754

对于计算任何给定双值的实平方根的问题,编程访谈元素的作者提出solution,其中2个双值a和{{1}之间的差异计算如下:

b

我的问题是:

  1. 除以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; } 的重点是什么?这如何解决“精确问题”?

  2. 我完全不理解b的重要性;最小值的概念大于1.为什么它在epsilon()开始时有自己的常量?

2 个答案:

答案 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/