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