問題タブ [fpu]
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 - double の Pow 実装
モーション コントロールに使用するコードを開発していますが、pow 関数に問題があります。VS2010 を IDE として使用しています。
これが私の問題です:私は持っています:
この最後の関数を評価すると、結果としてより良い近似が得られません。私は 7 桁の 10 進数を正しく取得していますが、その結果の桁はすべてゴミです。pow 関数は、入力変数のみを float としてキャストし、計算を続行すると推測しています。
- 私は正しいですか?
- もしそうなら、より良い精度のために pow を再実装するために「インスピレーション」を得ることができるコードはありますか?
編集:解決しました。
結局、OGRE 3D フレームワークで使用されていた Direct3D が原因で、FPU 構成ビットに問題がありました。
OGRE を使用している場合は、構成 GUI で「Floating-point mode=Consistent」を設定します。
生の Direct3D を使用している場合は、CreateDevice を呼び出すときに、必ず「D3DCREATE_FPU_PRESERVE」フラグを渡してください。
元の投稿:
FPU のデフォルトの精度を単精度に変更するライブラリを使用している可能性があります。次に、すべての浮動小数点演算は、double であっても、実際には単精度演算として実行されます。
テストとして、_controlfp( _CW_DEFAULT, 0xfffff ); を呼び出してみてください。( を含める必要があります) 計算を実行して、正しい結果が得られるかどうかを確認してください。これにより、浮動小数点制御ワードがデフォルト値にリセットされます。他の設定もリセットされるため、問題が発生する可能性があることに注意してください。
浮動小数点の精度を変更する一般的なライブラリの 1 つは Direct3D 9 (おそらく他のバージョンも) です。デフォルトでは、デバイスの作成時に FPU を単精度に変更します。これを使用する場合は、デバイスの作成時にフラグ D3DCREATE_FPU_PRESERVE を指定して、FPU の精度が変更されないようにします。
vba - VBA から dll 関数を呼び出すときの浮動小数点エラー
これが状況です。MS Visual Strio 2005 と Excel 2007 を使用しています。関数を含む dll を作成します。
これは、Excel VBA から呼び出されます。この機能は正しく動作しているようです。しかし、問題があります。VBA が関数から戻り、次の浮動小数点命令を実行しようとすると、次のウィンドウが表示されます。
実行時エラー 6. オーバーフロー。
このエラーはかなり奇妙です。私はここ数日それを調査してきました、ここに私が集めた「事実」があります:
1) エラーは、dll への最初の呼び出しの後にのみ表示されます。この関数を連続して呼び出しても、このエラーは発生しません。
2) エラーは、コントロールが dll から戻った後、VBA コード内の最初の (一見無害な) 浮動小数点命令によってトリガーされます。
3) dll のビルド元のプロジェクトには、mydll.cpp、mydll.def、cSomeClass.cpp、および cSomeClass.h の 4 つのファイルが含まれています。
cSomeClass
私の他のライブラリからコードを呼び出すかなり複雑なクラスです。しかし、mydll.cpp
決して使用cSomeClass
しません。のコードは次のmydll.cpp
とおりです。
の初期バージョンにMyFunc()
は最初の 3 行 ( をいじっているもの) がなく、VBA_controlfp()
で発生していました。"Runtime Error 6, Overflow"
次に、このエラーが FPU レジスタに関連している可能性があるのではないかと疑い始めました (それらについてはほとんど知りません)。_controlfp()
これらの 3 行を追加すると、 - を呼び出すと例外がスローされました"0xC0000090: Floating-point invalid operation."
。コードを上に示したままにしておくと、例外によってスタックが巻き戻され (行に到達しません) 、Excel にVARIANT res;
ウィンドウが表示されます。"runtime error 6. Overflow."
まとめると、これらの 3 行を追加すると、浮動小数点例外が先にスローされます。3 行目でスローされた例外を (__except
節で) キャッチし、それを ( callng で_clearfp()
) 無視すると、Excel でエラーは報告されません。
厄介な詳細: ファイルを削除cSomeClass.cpp
しcSomeClass.h
、Visual Studio プロジェクトからエラーが再現されません。cSomeClass.h
には含まれていませんが、プロジェクトからファイルmydll.cpp
を削除cSomeClass.*
すると、dll のサイズが大幅に縮小されます。
この時点での私の最善の推測は、これによって参照される LIB-s にいくつかの静的オブジェクトがあるcSineClass.cpp
ということです。おそらく、これらのオブジェクトは、dll がロードされているときに初期化 (構築) され (私の実験によると、前にDllMain
)、これによりエラーフラグ"0xC0000090: Floating-point invalid operation."
が設定されます。dll から Visual Basic に戻ると、somethis は_controlfp
浮動小数点例外を呼び出して有効にします (С++ では無効になっています) 。発生が Excel で見られるものに"0xC0000090: Floating-point invalid operation."
何らかの形で変換されます。"Runtime Error 6. Overflow."
これは単なる推測です。これまでのところ、これを実行できる静的オブジェクトは見つかりませんでした。
残念ながら、このエラーを再現する小さな例を作成できませんでした。これcSomeFile.*
は、プロジェクトの一部としてのみ表示されるためです。そして、それらのファイルにはすべてのライブラリが必要です...
誰かがそのような行動の原因を知っている場合、または私の調査を進める方法について提案がある場合は、大歓迎です.
assembly - コプロセッサが存在しない場合、arm asm の条件付きコプロセッサ ops は有効ですか?
指示は次のようなものですか
現在の条件コードにより、コプロセッサが存在しない限り操作が実行されないことが保証されている場合、必要なコプロセッサが存在しない可能性がある場合に ARM アセンブリで使用しても有効/安全ですか?
assembly - x86 asmに書き換えることによるintersectRaySpherecプロシージャの最適化(方法?)
Hullo、アセンブリについてはあまり知識がありません。これをx86(32ビットfpuまたはsse2)アセンブリで書き直すことで最適化する方法を考えています。最適化する必要があります。正しいアセンブリで書き直してから、テストします。速度が上がった場合(length()とdot()はここでもasmで記述する必要があります)このコードは私の単純なリアルタイムレイトレーサーで使用され、機能しますが、asmの最適化はあまり得意ではありません)
前もって感謝します
//編集
およびdemoexe(最適化されていないcでも最適化されていない):
dl.dropbox.com/u/42887985/re29.zip
たぶん誰かが私に長さドットのためのいくらか良いfpuasmルーチンを与えることができます(またはここに示されていない正規化)?? 交差手順の手順全体が最適ですが;-)
assembly - ST(0)をEAXに移動するには?
こんにちは、私は x86 FPU アセンブリを学んでいますが、答えが見つからない簡単な質問があります。
ST(0)
(FPU スタックの一番上)から に値を移動する方法はEAX
?
また:
このコードは正しいですか:
assembly - fpuで1 / fを逆に分割する方法は?
このような単純な質問で申し訳ありませんが、(数日からアセンブリを学習しています)しかし、私は本を閲覧していて答えを見つけることができませんでした
1/f を数える適切な迅速な方法は何ですか?ここで f は x86 fpu の浮動小数点数です
それは...ですか
?
それは適切です(文字通り、fdivr引数についてはわかりません)、または最も簡単な方法ですか?
//編集
これは、1/f (または古典的な fpu asm で 1/sqrt(f)) を分割するための最良の方法ですか? (sse なし、および carmack トリックなし-l8er で試してみます。今は「適切な fpu」を実行するだけです)
assembly - asm (fpu) normalize - 最適化する方法
x86 asm - 3 つの float のベクトルを正規化する fpu ルーチン - をいくつか作成しました。
[これは私のコードです ;-) 動作し、私によってテストされました]
私はx86アセンブリをあまり知りません。上記の最適化を見つけたいと思います(特にsseなしの純粋なfpu古いasmですが、上記よりも多少最適化されています)
特に、上記のコードに不完全なコーディングがあるのではないかと思います: fpu スタックに xyz ベクトルをロードし、1/sqrt(x*x+y*y+z*z) をカウントしてから、RAM から xyz を再度ロードし、値を掛けます。お店 -
これは部分最適化であり、xyz を 1 回だけ (2 回ではなく) ロードしてから、fpu スタック カウントに保持してから最後に保存する必要がありますか?
c - asmでのcarmackのinvsqrt
Hullo、私はasmの経験があまりないので、アセンブリでカーマックの逆平方根cルーチンを書き直したいと思います。
これがコンパイラが生成したものですが、それを最適化してasmルーチンに書き直したいと思います
(生成されたこのコードは、最適なものとはほど遠いです-fpuと整数演算を混合すると、意識のある人によるいくつかのレブライトがそれを大幅に改善する可能性があります)
どのようにそれを最適化することができますか?
編集:
@haroldに答えるように
改善点があります:
1.0 / sqrt(100.0)は私の古いマシンで140サイクルかかります
InvSqrt-cバージョン-は44サイクルかかります(精度は驚くべきものではありませんが)
以下のasmのansverはcバージョンと同じように機能し、29サイクルかかります
(測定値は多少概算かもしれませんが、一般的には大丈夫なIMOのようです。rtdsc1000xforループによって実行され、結果として140000/1000=140サイクル29000/1000=29サイクルなどになります)
optimization - intersectRaySphere x86 fpu asm ルーチン - 最適化の方法
こんにちは、私はいくつかのCプロシージャを持っています:
x86 fpu asmで書き直してそのようなものを作成しようとしていました
テスト済みで、正常に動作しています。c ルーチンは約 150 サイクル (6 または 7 年前の pentium 4 で) かかり、私の asm ルーチンは約 66 サイクルかかります (*)。まだ少し改善?
tnx
(*) ランダムな入力データであまり注意せずにテストしていたので、おそらく「非交差」の原因でした-sqrtが関与していません
c++ - 乗算およびLUTとしての除算?/高速フロート除算の逆数
ルックアップ テーブルの形式で float 除算の逆数を作成することは可能ですか (1/f -> 1*inv[f] など) ? どのようにそれを行うことができますか?一部とマスクとシフトをフロートに適用して、インデックスの形式にする必要があると思いますか? 正確にはどうですか?