Let y/d
是精确的操作,并且q=rnd(y/d)
将结果四舍五入到最接近的浮点数。
那么真实误差乘以 d 就是rt=(rnd(y/d)-y/d)*d=q*d-y
我们用 fmadd 执行的操作是r=rnd(q*d-y)
Why q*d-y
是精确的(fmadd 没有最终舍入)解释起来不太清楚,但可以这么说q*d
位数有限(<nbits(q)+nbits(d)
), 的指数y
是那个q*d
(+/- 1) 并且由于错误是|rt|<0.5*ulp(q)*d
,这意味着首先nbits(q)
正在消失……这回答了问题 1。
So q*1e98 - y = r
, 在哪里|r|*2^1074 <= 0.5e98 < 5*10^98
(第二个不等式是幸运的)
q*(10^98) - y = r + (10^98-1e98)*q
where |10^98-1e98|*q*2^1074 <= 0.5e95
(假设至少 15 位精度,log(2^53)/log(10) > 15
)
所以你问是否|q*(10^98)-y|*2^1074>5*10^97
你有一个近似值|q*(10^98)-y|
这是r+1e98_2*q
Since |r| < 5*10^98
, and |r+(10^98-1e98)*q|<|r|
如果符号相反,我认为问题 2 的答案是肯定的。但我不太确定 1e98_2 是否
If r
and 1e98_2
有相同的符号,它可能会超过5*10^97
,因此您进一步处理讨论r3 = 1e98_2*q + r
versus h=0.5e98*2^-1074
对于问题 3,乍一看,我认为有两件事可能导致算法失败:
真正的错误r3t
大约是(1e98_2-3e63)*q + r < r3
(只有 >0 时的情况才让我们感兴趣,因为 1e98_2>0)。
因此,当真实误差 r3t 低于真实 tie ht 时,误差 r3 的近似值落在近似 tie h 之上可能会导致不正确的舍入。是否可能?如果可以,您的问题 3 出现的频率是多少?
为了减轻上述不平等风险,您尝试截断 r3 的大小,因此r3 <= 1e98_2*q + r
。我对错误界限进行真正的分析感到有点累......
所以我扫描了一个错误,我发现的第一个失败示例是 1.0000000001835e110 (我假设正确舍入到最接近的双精度,但实际上是 1000000000183.499999841537998211209154249426305282256955264919632918469 57919215885146546696544423465444842668032e98)。
在这种情况下,r
and 1e98_2
具有相同的符号,并且
(x/1e98) > 1000000000183.50000215
q
因此有效数字被四舍五入为1000000000184
r3>h
(r3*2^1074
大约是。 5.000001584620017e97) 并且我们错误地增加了q+s
,当它应该是q-s
, 绝对是一个错误.
我的答案是:
yes, r=fmadd(q * 1e98 - y)
正好是 1e98*(除法时出错),但我们不关心除法,它只是提供一个猜测,重要的是减法是否准确。
是的,该符号是正确的,因为|r| < 5*10^98
, and |r+(10^98-1e98)*q|<|r|
如果符号相反。但我不太确定 1e98_2 是否
举第一个失败的例子(1.0000000001835e110 - 1.0e110)/1.0e110 ulp -> 1.099632e6
,一个非常非常天真的猜想是说,一百万分之一的情况下,r3 会超过 h...所以一旦 q+s 纠正为 q-s,就会发生r3>h
while r3t<ht
无论如何,都比 1/1,000,000 小得多...感兴趣的范围内有超过 10^15 个双精度数,所以考虑这不是一个严肃的答案...
是的,上面的讨论只是关于猜测 q,与它的产生方式无关,并且 1. 中的减法仍然是准确的......