Nagy számok közelről · 3 perc olvasás
Egymillió összeadás, változatlan eredmény: hová tűnnek a kis tagok?
Induljunk 10 000 000 000 000 000-ról, és adjunk hozzá egymilliószor egyet. Egyszerű, lépésenként kerekítő binary64 számításban a tárolt érték minden alkalommal változatlan maradhat. Ha az egymillió egyest előbb külön összeadjuk, a teljes növekmény megmarad. Itt már az elvégzés módja is a számítás része.
Ebben a cikkben
A nagy számok körül ritkábban vannak ábrázolható értékek
A cikk az elterjedt IEEE 754 binary64 formátummal számol, a legközelebbi értékre kerekítés szokásos, felező esetben párosra döntő szabályával. Ez 53 bites szignifikáns pontosságot ad. A szám nagysága növelhető a kitevővel, de a megőrzött értékes bitek száma véges. A Python hivatalos útmutatója is ebből vezeti le a lebegőpontos műveletek korlátait.
A 10 000 000 000 000 000 közelében a szomszédos ábrázolható számok távolsága 2. A kezdőérték maga pontosan tárolható, a kezdőérték plusz 1 azonban két ábrázolható szám közé esik. A megadott kerekítési szabállyal visszakerül a kezdőértékre. A kezdőérték plusz 2 már tárolható. Ez a belső számábrázolás tulajdonsága, a képernyőn mutatott tizedesjegyek számától függetlenül.
Minden apró növekmény külön elveszhet
Ha a kezdőértékhez egyenként adunk hozzá egymillió darab 1-et, minden művelet után ugyanarra a kezdőértékre kerekítünk vissza. A következő összeadás tehát újra ugyanabból a helyzetből indul. A ciklus végén 10 000 000 000 000 000 marad, miközben a pontos matematikai eredmény 10 000 000 001 000 000.
Ha előbb a kis tagok összegét képezzük, egymilliót kapunk, amelyet a nagy kezdőértékhez egyszer adunk hozzá. A 10 000 000 001 000 000 ebben a formátumban pontosan ábrázolható, így a teljes növekmény megmarad. Ez a saját példa egymillió egységnyi eltérést hoz létre pusztán az összeadások csoportosításával.
Három tagból is kijön két eltérő eredmény
Jelölje A a 10 000 000 000 000 000 értéket. A leírt formátumban (A + 1) − A = 0, mert a zárójeles összeadásban az 1 elveszik. Ezzel szemben (A − A) + 1 = 1. Valós számok pontos matematikájában a két kifejezés azonos eredményű lenne; a köztes kerekítések miatt a gépi műveletsorok eltérnek.
Közel azonos nagy mennyiségek kivonása különösen érzékeny lehet arra, hogy mennyire pontosak a bemenetek. Ha a kis különbség már a korábbi tárolásnál vagy összeadásnál eltűnt, a kivonás nem tudja visszahozni. Az eredmény kijelzése húsz tizedesjeggyel sem állítja helyre az elveszett információt.
A jobb összegzésnek is ismerni kell a korlátját
Több részösszeget követő vagy kompenzált összegzési módszerek csökkenthetik az összeadás közbeni információvesztést. Pythonban a math.fsum például az [A, 1, −A] külön átadott tagokra 1-et ad a vizsgált környezetben. A dokumentáció az ilyen összegzés pontossági előnyét és a lebegőpontos környezethez kötött korlátait is leírja.
Ha azonban már csak a kerekített A + 1 eredményt, vagyis A-t adjuk át egy későbbi algoritmusnak, az eredeti plusz egyes többé nincs jelen a bemenetben. A pontosabb összegzés az előtte elvesztett adatot nem találja ki. Ezért az adatok ábrázolását, az összegzést és a későbbi különbségképzést együtt kell megtervezni.
Mikor más számábrázolás a jó választás?
Egész darabszámhoz olyan egész típust válassz, amelynek tartománya elég nagy; szükség esetén tetszőleges pontosságú egészt. Előre meghatározott tizedes pontosságú feladathoz használható megfelelően beállított decimális vagy fixpontos számítás. Mérési és tudományos feladatoknál gyakran továbbra is a lebegőpontos ábrázolás praktikus, de a skálát és az elfogadható hibát is rögzíteni kell.
Egymilliárd környékén a binary64 szomszédos számai közötti távolság körülbelül 0,0000001192; az egész értékek ezért ott még pontosan megkülönböztethetők. A veszteség mértéke a nagyságrendtől függ. Ellenőrzéshez olyan bemenetet is válassz, amelyben nagy és kicsi, pozitív és negatív tagok keverednek, és hasonlítsd az eredményt egy pontosabban számolt referenciaértékhez.
A példák és a források
A számpéldák saját, szemléltető feladatok; a megadott feltételezésekből és képletekből újraszámolhatók. Valós vállalkozásra, országos statisztikára vagy jövőbeli eredményre nem vonatkoznak.
- Python: Floating-Point Arithmetic, a binary64 pontossága és a kerekítési hibák ↗
- Python math.fsum és math.ulp: pontosabb összegzés és az ábrázolható értékek távolsága ↗
Forrásellenőrzés: 2026-11-09. A hivatkozások a fogalmakat és a módszert támasztják alá; a példaszámítások a cikk részei.
Négy kérdés a cikkhez
A válaszokból kiderül, melyik összefüggést érted már, és melyik részt érdemes újraolvasnod. A válaszokat és a pontszámot nem mentjük.