問題タブ [x87]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - i387 fsqrt 命令で正しい丸めを取得する方法はありますか?
i387 fsqrt 命令で正しい丸めを取得する方法はありますか?...
... x87 制御ワードで精度モードを変更することは別として- それが可能であることはわかっていますが、sqrt 操作が中断された場合に精度モードが間違ってしまう厄介な再入可能タイプの問題があるため、合理的な解決策ではありません。
私が扱っている問題は次のとおりです。x87fsqrt
オペコードは、拡張 (80 ビット) 精度であると仮定する fpu レジスタの精度で、正しく丸められた (IEEE 754 ごとの) 平方根演算を実行します。ただし、(現在の丸めモードに従って) 結果が正しく丸められた効率的な単精度および倍精度の平方根関数を実装するために使用したいと考えています。結果の精度が過剰になるため、結果を単精度または倍精度に変換する 2 番目のステップで再び丸めが行われ、結果が正しく丸められない可能性があります。
一部の操作では、バイアスを使用してこれを回避できます。たとえば、倍精度値の 52 の有効ビットを 63 ビットの拡張精度仮数の最後の 52 ビットに強制する 2 の累乗の形でバイアスを追加することで、加算結果の過剰な精度を回避できます。 . しかし、平方根を使ってそのようなトリックを行う明確な方法はわかりません。
何か賢いアイデアはありますか?
(意図したアプリケーションが Csqrt
とsqrtf
関数の実装であるため、C もタグ付けされています。)
assembly - 除算 8086/8087 1/3 = 3?
fdiv
!!!!の使用に大きな問題があります。私は分割しようとして1/3
いるので、これが私がしていることです
ご覧のとおり、結果が表示さresultado
れないため、結果をに移動しますst(0)
(tasm を使用しているため、デバッガーで変数を確認でき3EAAAA3A
ます) 40400000
。3
どのように可能ですか?? 変数を交換してみましたが、何もありません!!! 手伝って頂けますか??=(
assembly - FSTENV?この指示に関する情報はほとんど見つかりません
私はプログラムでこの命令を持っています:
それは何をするためのものか?
どのレジスタを使用して更新しますか?
ありがとうございました!
c++ - C++ で 8087CW をリセットすると、.NET アプリケーションで例外が発生する
私は、C# で .NET 3.5 アプリケーションを使用しており、レガシー C++ コードを定期的に呼び出しています。ドロップダウン リストを持つ Infragistics UltraGrid にマウスを合わせると、C++ を呼び出すと「オーバーフローまたはアンダーフロー算術演算」が発生することがあることに気付きました。これは、C++ コードが次のことを行う場合にのみ発生することがわかりました。
最後の行をコメントアウトすると、.NET アプリケーションでエラーが発生しなくなりました。アプリケーションの残りの部分で、他の副作用に気づいていません。簡単な修正として、この行をコメントアウトしたままにします。FPU 例外を無効にし、コントロール ワードをリセットしないと、どのような影響がありますか?
c++ - これはsqrt関数のバグですか
64ビット範囲の素数を計算するアプリケーションを作成したので、sqrt
関数を使用して64ビット数の平方根を計算しようとするとmath.h
、たとえば入力が~0ull
答えである場合、答えは正確ではないことがわかりまし~0u
た。私が得0x100000000
たものは正しくないので、これがバグであるかどうかを確認するために、アセンブリx86言語を使用して独自のバージョンを作成することにしました。これが私の関数です。
入力は、平方根を取得するための奇数です。同じ入力で関数をテストすると、結果は同じでした。
私が得られないのは、なぜそれらの関数が結果を丸めるのか、具体的にはsqrt
命令が結果を丸めるのかということです。
assembly - unsigned intを変換するときにGCCはどのようにfildllを使用できますか?
Intel命令セットリファレンスクレーム(強調私のもの):
符号付き整数のソースオペランドを倍精度拡張精度浮動小数点形式に変換し、値をFPUレジスタスタックにプッシュします。ソースオペランドは、ワード、ダブルワード、またはクアッドワード整数にすることができます。丸め誤差なしでロードされます。ソースオペランドの符号は保持されます。この命令の動作は、非64ビットモードと64ビットモードで同じです。
ここに私のテストケースを見ることができます:
c - アセンブリに浮動小数点/倍精度数を追加する
インラインアセンブリを試してみて、インラインアセンブリに10進数(整数ではなく)を追加しようとしています。問題は、次の関数を呼び出すときです。
コンパイラは、インラインアセンブリ(プッシュおよびポップ命令行を除くすべてのアセンブリ行)での不適切なオペランドサイズについて文句を言います。したがって、unsigned longなどの整数型に変更する必要があります。そうすれば機能しますが、もちろん整数型のみをサポートします。小数の結果は四捨五入されます。
8.4のような小数の結果を可能にするアセンブリを追加する方法はありますか?
c++ - 浮動小数点命令の異常 -- FLDZ の誤動作?
ここに以前に投稿した問題をデバッグしようとしています:
C++ と pin ツール - 非常に奇妙な DOUBLE variable issue with IF statement。gdbを使用して、奇妙な動作が発生した瞬間を追跡しました。私が見つけたものは、逆アセンブルされたコードと浮動ポインターレジスター値を表示する gdb スクリーンショットを示す下の図に示されています。(拡大画像はこちら)
左側の画像は、強調表示
FLDZ
された命令が実行される前のスクリーンショットを示し、右側の画像は命令が実行された後のスクリーンショットを示しています。x86 ISA を調べたところ、FLDZ
にロード+0.0
するためのものST(0)
です。しかし、私が得るのは-nan
代わりに+0.0
. なぜこれが起こるのか誰か知っていますか?私が使用しているシステムは、64 ビット CentOS を実行する Intel xeon 5645 ですが、デバッグしようとしているターゲット プログラムは 32 ビット アプリケーションです。また、以前の投稿で述べたように、4.2.4 と 4.1.2 の 2 つのバージョンの gcc を試したところ、同じ問題が発生しました。ありがとう。
--追記-- ちなみに以下がソースコードです。
assembly - ST(0)をEAXに移動するには?
こんにちは、私は x86 FPU アセンブリを学んでいますが、答えが見つからない簡単な質問があります。
ST(0)
(FPU スタックの一番上)から に値を移動する方法はEAX
?
また:
このコードは正しいですか:
c++ - Visual C++ 2012 での正弦計算の不一致?
次のコードを検討してください。
Visual C++ 2012 ( cl fputest.cpp
) でコンパイルし、プログラムを実行すると、出力は次のようになります。
質問:
- これら 2 つの値が異なるのはなぜですか?
- 計算された正弦値がまったく同じになるように、いくつかのコンパイラ オプションを発行することは可能ですか?