私は、いくつかの計算を行い、 を に変換する古い実装に依存していfloat
ますint
。
ただし、計算を複製した後、丸め結果が異なるため、一部の値がずれています。
要するに、バイナリが afloat
をint
( long
) に変換するために次のコードを使用していることです。
lea ecx, [esp+var_8] ; Load Effective Address
sub esp, 10h ; Integer Subtraction
and ecx, 0FFFFFFF8h ; Logical AND
fld st ; Load Real
fistp qword ptr [ecx] ; Store Integer and Pop
fild qword ptr [ecx] ; Load Integer
mov edx, [ecx+4]
mov eax, [ecx]
test eax, eax ; Logical Compare
jz short loc_3 ; Jump if Zero (ZF=1)
loc_1:
fsubp st(1), st ; Subtract Real and Pop
test edx, edx ; Logical Compare
jz short loc_2 ; Jump if Zero (ZF=1)
fstp dword ptr [ecx] ; Store Real and Pop
mov ecx, [ecx]
add esp, 10h ; Add
xor ecx, 80000000h ; Logical Exclusive OR
add ecx, 7FFFFFFFh ; Add
adc eax, 0 ; Add with Carry
retn ; Return Near from Procedure
; ---------------------------------------------------------------------------
loc_2:
fstp dword ptr [ecx] ; Store Real and Pop
mov ecx, [ecx]
add esp, 10h ; Add
add ecx, 7FFFFFFFh ; Add
sbb eax, 0 ; Integer Subtraction with Borrow
retn ; Return Near from Procedure
; ---------------------------------------------------------------------------
loc_3:
test edx, 7FFFFFFFh ; Logical Compare
jnz short loc_1 ; Jump if Not Zero (ZF=0)
fstp dword ptr [ecx] ; Store Real and Pop
fstp dword ptr [ecx] ; Store Real and Pop
add esp, 10h ; Add
retn ; Return Near from Procedure
これは、単に unsigned を実行する場合とは異なる動作をしint var = (unsigned int)floatVal;
ます。
これは古いftol
実装であり、 からfloat
への変換int
が非常に遅く、コンパイラが FPU 丸めモードを変更する必要があったために行われたと思います。
これと非常によく似ています http://www.libsdl.org/release/SDL-1.2.15/src/stdlib/SDL_stdlib.c
関数をCに変換するのを手伝ってくれる人はいますか? または、 Visual Studio を使用してfloat
パラメーターとリターンを使用してインライン ASM 関数を作成する方法を教えてください。int
の 1SDL_sdtlib.c
つにはヘッダーがなく、関数の引数なしで呼び出す方法がわかりません。