是否存在一个IEEE双x>0
这样sqrt(x*x) ? x
,该计算的情况下x*x
不会溢出或下溢到Inf
,0
或反规范多少?
这给出了sqrt
返回最接近的可表示结果,并且同样如此x*x
(两者都是IEEE标准规定的,"平方根操作被计算为无限精度,然后四舍五入到指定的两个最接近的浮点数之一)围绕无限精确结果的精度").
假设如果存在这样的双打,那么可能有接近1的例子,我写了一个程序来找到这些反例,并且它找不到任何之间1.0
和1.0000004780981346
.
以前类似的问题完全平方数和浮点数解答了其中的计算情况下,当负的问题x*x
并没有涉及到舍入.这个答案对于这个问题是不够的,因为有可能x*x
涉及在一个方向上sqrt(x*x)
进行舍入,然后涉及在同一方向上进行舍入,从而产生一个不完全正确的答案x
.
Sylvie Boldo已经正式证明,不存在满足问题条件的浮点数.
引用文章的摘要:
浮点专家知道,在浮点运算中实现时,数学公式可能会失败或给出不精确的结果.本文描述了一个例子,令人惊讶的是,绝对不是这样的.实际上,使用基数2和无界指数范围,浮点数a的平方的平方根的计算正好是| a |.结果是/ sqrt(a 2 + b 2)的浮点计算总是在区间[-1,1]中.这样就无需在此值上调用arccos或arcsin时进行测试.为了更多保证,使用Coq校样助手和Flocq库正式检查了该属性.结论将给出关于在没有假设和其他基数的情况下发生的事情的暗示,其中行为是非常不同的.
"使用基数2"可能隐含在你的问题中(尽管IEEE也标准化了十进制浮点数格式和运算),"无界指数范围"相当于你的"无溢出或下溢"限制.
使属性成为可能的原因是x*x
"扩展"(例如,区间[1,2]被映射到[1,4]),使得当没有上溢或下溢时,舍入为可以发生*
良性,x
并且仍然是浮点产品的实平方根的最接近可表示的浮点数x*x
.这种手工波浪的论证并不构成证据,所以上面链接的文章包含一个是好事.