当前位置:  开发笔记 > 编程语言 > 正文

IEEE双重使得sqrt(x*x)≠x

如何解决《IEEE双重使得sqrt(x*x)≠x》经验,为你挑选了1个好方法。

是否存在一个IEEE双x>0这样sqrt(x*x) ? x,该计算的情况下x*x不会溢出或下溢到Inf,0或反规范多少?

这给出了sqrt返回最接近的可表示结果,并且同样如此x*x(两者都是IEEE标准规定的,"平方根操作被计算为无限精度,然后四舍五入到指定的两个最接近的浮点数之一)围绕无限精确结果的精度").

假设如果存在这样的双打,那么可能有接近1的例子,我写了一个程序来找到这些反例,并且它找不到任何之间1.01.0000004780981346.

以前类似的问题完全平方数和浮点数解答了其中的计算情况下,当负的问题x*x没有涉及到舍入.这个答案对于这个问题是不够的,因为有可能x*x涉及在一个方向上sqrt(x*x)进行舍入,然后涉及在同一方向上进行舍入,从而产生一个不完全正确的答案x.



1> Pascal Cuoq..:

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.这种手工波浪的论证并不构成证据,所以上面链接的文章包含一个是好事.


我相信这个结果,但仍然觉得非常令人惊讶.
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有