Bajki opowiadasz...
Opowiem dokładnej na czym polega tu problem.
W c/c++ konwersja z BYTE na float polega na zwyczajnym przepisaniu bajtu do zmiennej int32,
co dopiero potem to jest ładowane do FPU, gdzie jest robiona konwersja: int -> float;
czy to tak wygląda:
// float = bajt; w c/c++
// produkuje kod typu:
mov eax, byte
mov temp32, eax
fldi temp32
fstp sp, dword ptr float
jak widać jest to przekombinowane...
ale i tak słabo w porównaniu do odwrotnej operacji: float w bajt!
/// byte = float; // b = round(f)
fld dword ptr [ebx]; // ładuje float
call __ftol
mov byte ptr [esi],al
no i to jest masakra: ten głupek wywołuje funkcję do przerobienia floata na int: ftol, dla każdego bajta!
tak wygląda ta funkcja!:
ftol ->
fstcw temp1.w0 ; save the control word
fwait
mov al, temp1.by1
or temp1.by1, 0Ch ; set rounding control to chop
fldcw temp1
fistp qword ptr temp2 ; convert to 64-bit integer
mov temp1.by1, al
fldcw temp1.w0 ; restore the control word
mov eax, temp2.dd0 ; return LS 32 bits
mov edx, temp2.dd1 ; MS 32 bits
widać teraz jaki to jest prymityw?
a poprawna konwersja float na int (w wersji z FPU) z zaokrągleniem! wygląda tak:
fld float
fstp int
ładnie się to badziewie skróciło, co nie? :)
Widać teraz różnicę, i na czym polega problem?