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

Search the boards