Double számábrázolás hibáját hogyan lehet minimálisra csükkenteni egy ciklusban?
Az alábbi probléma egy szinte minden numerikus számítást végző programban előforduló tipikus és nagyon alapvető numerikus hibalehetőség:
Tegyük fel, hogy van egy for ciklusunk az alábbi formában:
for (double x; x < Y; x += dx)
{
// numerikus kód
}
Az a probléma, hogyha mondjuk dx=0.1-et adunk meg lépésköznek, az nem egzaktul 1/10 a double számábrázolás miatt. Tipikusan a 15 jegyből az utolsó nem stimmel. Ha nagyon sokat lépünk akkor a hiba megnövekszik, hiszen minden lépésben összeadódik. 100 lépés múlva például már az utolsó három számjegy hibás. Ha Y rögzített, és például egységnyi, akkor dx=1e-7 -nél kisebb lépésköznek nincs értelme, mert a hiba a ciklus alatt ennél nagyobbra nő. Ez egy elég durva hiba, ráadásul még semmit nem is számoltunk, csak egy ciklusunk van. Van valami library ami megoldja ezt a problémát? Vagy dx értékének tudunk választani valami speckó számot, ami egzaktul ábrázolódik double-ba?
Ahogy az első mondja, ne hordozd magaddal a korábbi összeadások hibáit, számold ki újra mindig. Tehát
for (double x; x < Y; x += dx)
helyett
double base, x;
for (int i(0); (x = base+i*dx)<Y; ++i)
{
//...
}
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!