Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



chyba při výpočtu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: chyba při výpočtu

Autor: _Ludanek

20:25:33 24.07.2008

Nesypej, rad zavzpominam a vybalim kdesi z koutku mozku informace, ktere u jsem skoro zapomnel. jo, to byly casy, kdyz jsem taky se zajimal o FPU. teda spis o zpusob jak ho napodobit, mel jsem totiz 386DX bez kopro a standardni emulace mi prisla pomala. a tenkrat si mi podarilo docilit toho, ze me vlastnorucni vypocti v single precision byly 10x rychlejsi nez normalni operace na single pres emulaci v turbo pascalu :)

Citovat příspěvek

 

Re: chyba při výpočtu

Autor: Luboš

19:10:07 24.07.2008

Sypu si popel na hlavu. Měl jste pravdu. Pokud dám na začátek finit (inicializace CPU) tak je vše ok. Díky za pomoc.

Citovat příspěvek

 

Re: chyba při výpočtu

Autor: Luboš

18:34:36 24.07.2008

S angličtinou jsem na tom dost bídně, ale z toho co jsem kde vyčetl by to mělo být spíš naopak. CPU by měl po inicializaci počítat v max. přesnosti, tj. real10.
Zajímavé je i to, že pokud vezmu číslo zvětšené nebo zmenšené o 1, tak přičtení nebo odečtení jedničky proběhne správně.
Viz následující případy:

9999999999999999 - 1 = 9999999999999998 ok
9999999999999999 + 1 = 10000000000000000 ok

10000000000000000 - 1 = 10000000000000000 chyba !
10000000000000000 + 1 = 10000000000000000 chyba !

10000000000000001 - 1 = 10000000000000000 ok
10000000000000001 + 1 = 10000000000000002 ok

Citovat příspěvek

 

Re: chyba při výpočtu

Autor: _Ludanek

16:52:32 24.07.2008

Mam takovy pocit, ze CPU je treba nejdrive prepnout, aby v 80 bitech pocitalo, ze jinak pocita jenom s 2nasobnou presnosti.

koukni treba sem, na pole precision control

http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm#cword

Citovat příspěvek

 

Re: chyba při výpočtu

Autor: Luboš

1:16:00 22.07.2008

V podstatě máte pravdu, ale to o čem mluvíte se děje pouze v případě kdy je překročen rozsah mantisy, nebo pokud se do jiné soustavy převádí desetiné číslo. V mém případě se ale pracuje s celými čísly a v mantise zůstává ještě 10 volných bitů. Mantisa má rozsah 64 bitů a číslo 10000000000000000 má 54 bitů !
Pro mně je to stále záhada.

Citovat příspěvek

 

Re: chyba při výpočtu

Autor: 1287

13:46:59 21.07.2008

Protože FPU neumí nic takového jako reálná čísla z reálného světa.
FPU používá datové typy s 32, 64 a 80 bity a to znamená diskrétní přesnost reálného čísla, která je maximálně asi 18 desítkových číslic.
Dále do hry vstupuje to, že FPU nepoužívá desítkové číslice, ale dvojkovou soustavu a proto když se výpočet pohybuje na hranici, tak se prostě uplatní zaokrouhlení na úrovni dvojkové soustavy, které způsobí na úrovni desítkové soustavy zdánlivě nepochopitelné chování.
Vše se ovšem vyjasní, když se reálné číslo nechá vypsat jako pole bytů a dekóduje se do dvojkové soustavy podle tohoto dokumentu, Chapter 7.4
http://download.intel.com/design/PentiumII/manuals/24319002.PDF

Citovat příspěvek

 

chyba při výpočtu

Autor: Luboš

14:19:03 19.07.2008

Nechal jsem se inspirovat dotazem na "http://forum.builder.cz/read.php?13,2671628" a chvíli jsem si hrál s numerickým procesorem. Myslel jsem si, že chyba výpočtu je dána velikostí mantisy datového typu double(REAL8) a tak jsem zvolil datový typ REAL10. Ale i zde dochází k chybě při výpočtu.

.data
par1 REAL10 10000000000000001.0
par2 REAL10 10000000000000000.0
par3 REAL10 1.0
par4 REAL10 0.0

.code
start:
fld [par1] ; st(0) = par1
fld [par3] ; st(1) = st(0) / st(0) = par3
fadd ; st(0) = st(1) + st(0)
fld [par1] ; st(1) = st(0) / st(0) = par1
fsubp st(1),st ; st(0) = st(1) - st(0)
fstp [par4] ; par4 = st(0)
; v tomto případě je výsledek 1

fld [par2] ; st(0) = par2
fld [par3] ; st(1) = st(0) / st(0) = par3
fadd ; st(0) = st(1) + st(0)
fld [par2] ; st(1) = st(0) / st(0) = par2
fsubp st(1),st ; st(0) = st(1) - st(0)
fstp [par4] ; par4 = st(0)
; v tomto případě je výsledek nula !!!

Zjednodušeně řečeno:
(10000000000000001 + 1) - 10000000000000001 = 1
(10000000000000000 + 1) - 10000000000000000 = 0 !?!

ALE PROČ ! NECHÁPU TO !

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: