有什么方法可以使用 i387 fsqrt 指令进行正确的舍入?...
...除了更改x87 控制字中的精度模式之外 - 我知道这是可能的,但这不是一个合理的解决方案,因为它有令人讨厌的可重入类型问题,如果 sqrt 操作被中断,精度模式将是错误的。
我正在处理的问题如下:x87fsqrt
操作码以 fpu 寄存器的精度执行正确舍入(根据 IEEE 754)的平方根运算,我假设它是扩展(80 位)精度。但是,我想用它来实现高效的单精度和双精度平方根函数,结果正确舍入(根据当前舍入模式)。由于结果精度过高,将结果转换为单精度或双精度的第二步再次舍入,可能会留下不正确舍入的结果。
通过一些操作,可以通过偏差来解决这个问题。例如,我可以通过以 2 的幂的形式添加一个偏差,将双精度值的 52 个有效位强制转换为 63 位扩展精度尾数的最后 52 位,从而避免加法结果的精度过高. 但是我看不到任何明显的方法可以用平方根来做这样的把戏。
有什么聪明的主意吗?
(也标记为 C,因为预期的应用是 Csqrt
和sqrtf
函数的实现。)