i387 fsqrt 命令で正しい丸めを取得する方法はありますか?...
... x87 制御ワードで精度モードを変更することは別として- それが可能であることはわかっていますが、sqrt 操作が中断された場合に精度モードが間違ってしまう厄介な再入可能タイプの問題があるため、合理的な解決策ではありません。
私が扱っている問題は次のとおりです。x87fsqrt
オペコードは、拡張 (80 ビット) 精度であると仮定する fpu レジスタの精度で、正しく丸められた (IEEE 754 ごとの) 平方根演算を実行します。ただし、(現在の丸めモードに従って) 結果が正しく丸められた効率的な単精度および倍精度の平方根関数を実装するために使用したいと考えています。結果の精度が過剰になるため、結果を単精度または倍精度に変換する 2 番目のステップで再び丸めが行われ、結果が正しく丸められない可能性があります。
一部の操作では、バイアスを使用してこれを回避できます。たとえば、倍精度値の 52 の有効ビットを 63 ビットの拡張精度仮数の最後の 52 ビットに強制する 2 の累乗の形でバイアスを追加することで、加算結果の過剰な精度を回避できます。 . しかし、平方根を使ってそのようなトリックを行う明確な方法はわかりません。
何か賢いアイデアはありますか?
(意図したアプリケーションが Csqrt
とsqrtf
関数の実装であるため、C もタグ付けされています。)