1

与えられた角度の理想的な世界では、アイデンティティ FSIN * FSIN + FCOS * FCOS = 1 が常に成り立ちますが、浮動小数点数の制限により、完全には成り立ちません。たとえば、小さな値 (単一の 0x2F800001 など) を FCOS に渡すと結果は 1 になりますが、FSIN はゼロより大きい結果を返します。したがって、この場合は FSIN * FSIN + FCOS * FCOS > 1 になります。

私が取り組んでいる現在のアプリケーションでは、これは受け入れられませんが、受け入れられるのは FSIN * FSIN + FCOS * FCOS <= 1 の場合です。悲しいことに、ゼロ FPU 丸めモードへの丸めでも、上記の結果が引き続き発生するため、何かを行う必要があります。

このソリューションのパフォーマンスはかなり低いため、次のように FSIN または FCOS を再定義するよりも高速なソリューションを誰かが持っているかどうか疑問に思っています: FSIN = sqrt(1- FCOS * FCOS ) 。

クライアントを満足させるために外部ライブラリを使用したくないので、アセンブラまたはデルファイのいずれかのソリューションが必要です(クライアントはデルファイ2009を使用しています)。

編集:

function test_asm2:single;
asm // math coprocessor set to no exceptions, 53 bits precision, and round towards zero
 mov word([esp-2]),$1E3F
 fldcw word([esp-2])

 mov dword([esp-4]),$2F800001

 fld dword([esp-4])
 fsin
 fmul st(0),st(0)

 fld dword([esp-4])
 fcos
 fmul st(0),st(0)

 faddp
end;

これは、FSIN * FSIN + FCOS * FCOS <= 1 で、すべての有効な角度に対して切り捨てフラグを設定した場合とまったく同じように機能します。したがって、明日仕事に戻ると、トレースしてクライアントのコンパイラが丸めモードをリセットする場所を見つけるか、計算のアセンブラ バージョンを作成する必要があるようです。

4

0 に答える 0