spr*_*aff 8 c numeric ieee-754
假设我想将一个数字分成许多.
a /= x;
b /= x;
c /= x;
...
Run Code Online (Sandbox Code Playgroud)
由于乘法更快,诱惑就是这样做
tmp = 1.0f / x;
a *= tmp;
b *= tmp;
c *= tmp;
...
Run Code Online (Sandbox Code Playgroud)
1)这保证会产生相同的答案吗?我怀疑不是,但一些确认会很好.
2)如果 x非常大或非常小,我预计这会导致精度的显着降低.有没有一个公式可以告诉我我会牺牲多少精确度?
3)也许没有方便的公式,但我们至少可以说出数值不稳定性成为问题时的经验法则吗?它与操作数的大小有关,也可能与操作数的大小有什么关系?
1)不,不能保证产生相同的答案.即使使用IEEE,微妙的舍入效果也可能通过使用或导致1或2 ULP的不同.a/xa*(1/x)
2)如果x非常小(比DBL_MIN子法线的情况下略小于(最小归一化正浮点数)),1/x则INF完全失去精度.x当FP模型不支持子法线时,也会发生极大的精度损失.
通过|x|针对最大有限数<= 1/DBL_MIN和最小非零进行测试>= 1/DBL_MAX,代码可以确定何时开始显着的精度损失.公式可能取决于所使用的FP模型x以及模型的极限以及模型的极限.在这个binary64的范围内,二进制指数的差异x和Emin(或Emax)将是第一个失去比特的命令.
3)在上面讨论的范围内出现显着的数值不稳定性.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |