Posted By: dzemen () on 'CZprogram'
Title: Zaokrouhlovani cisla typu Extended-poznatek !
Date: Thu May 23 10:53:15 2002
Ahoj!
Pred par tydny jsem tu psal o nasledujicim problemu:
var A : Extended;
s : string;
Code : Integer;
begin
A := 824.5;
Str(A:1:0, s);
Val(s, a, Code);
end.
Takze spravne by na konci melo byt v A 825, protoze algoritmus zaokrouhluje na
0 desetinnych mist. Ale na nekterych pocitacich neni ! A prisel jsem na to
proc!
Na pocitacich, kde to blbne je FPU Control Word nastaven na: 1232h
Tam, kde je to spravne : 1332h
Po nahlednuti do manualu jsem zjistil, ze bit 8-9 se stara o presnost operaci
a jeho hodnoty jsou nasledujici:
00 - single precision, 24 bitu
01 - nepouzito
10 - double precision, 53 bitu
11 - extended precission, 64 bitu
Takze pokud je CW nastaven na 1332h (a tak ho taky Delphi nastavi) je vse OK,
protoze vypocty jedou v extended precision. Pokud ne, je u nekterych cisel
chyba. Zatim jsme zjistili, ze vsechna cisla, co jsou spatne maji v poslednim
10. bajtu VZDY hodnotu 40h (=64).
A ted prijde otazka: Jak se mi xakru muze to CW menit? Delphi ho pouzivaji
vzdy spravne, koukal jsem do zdrojaku RTL. Navic, i kdyz ho meni, vzdy je to
ve tvaru x3xxh, takze vzdycky s extended precision. A na zacatku programu se
vzdy v unite system nastavi na tech 1332h. Ja sam nikde ten CW nemenim. Chyba
se projevuje i kdyz vyse zmineny programek obsahuje pouze tyto radky a nic vic.
Divny, moc divny.
Napadlo me, ze by to mohla delat nejaka jina aplikace/DLL knihovna. Ale sam
zadnou nenatahuju a ty staticky nalinkovany si snad Delphi ohlidaji, ne ?
A navic: Pri prepnuti z ulohy do ulohy se obnovuji registry CPU i FPU, tak
proc ne FPU Control Word?
Co s tim ? Psat:
asm
fldcw Default8087CW
end;
pred kazdou float-point operaci se mi nechce. ;-(((
Dzemen