Forum » Programiranje » [JAVA] Zakaj Java (pa tudi drugi jeziki oz. okolja) ne more dobro računat floating pointov (float, double)?
[JAVA] Zakaj Java (pa tudi drugi jeziki oz. okolja) ne more dobro računat floating pointov (float, double)?
Fizikalko ::
Vem, da je aritmetiki s plavajočo vejico namenjen BigDecimal razred... Ampak mene zanima, ZAKAJ pride do napak pri računanju z double. Kaj je za tem in na katerem nivoju pravzaprav pride do napake? Rad bi kar se da podrobno razlago. Resnično hvala.
- spremenilo: Fizikalko ()
Fizikalko ::
Sam sklepam, da gre za problem na strojnem nivoju, ne pa na nivoju Jave (32 bitni hardware, torej posledično 2^32 natančnost). Če je to res, kako pa potem razredu BigDecimal? Zanima me torej implementacija, kar se da točno in podrobno.
jype ::
Ja, v n bitov lahko stlačiš le toliko in toliko natančnosti. Drugi problem je ta, da so nekatera povsem "luštna" decimalna števila v dvojiškem zapisu iracionalna (in obratno).
Če potrebuješ "finančno" natančnost, potem potrebuješ tak tip (ki računa tako kot ljudje, v desetiškem prostoru in z arbitrarno natančnostjo).
Kar se da podrobna razlaga je na IEEE 754 @ Wikipedia
Če potrebuješ "finančno" natančnost, potem potrebuješ tak tip (ki računa tako kot ljudje, v desetiškem prostoru in z arbitrarno natančnostjo).
Kar se da podrobna razlaga je na IEEE 754 @ Wikipedia
l0g1t3ch ::
Problem je dejansko v hardweru ki floating point števila računa po standardu IEEE 754. Ta standard določa računanje v plavajoči vejici in je dejansko nabolši vendar še vedno omejen z končno mesti natančnosti.
Mal si poglej na netu o tem standardu pa ti bo jasno zakaj prihaja do napak.
EDIT: me je jype prehitu
Mal si poglej na netu o tem standardu pa ti bo jasno zakaj prihaja do napak.
EDIT: me je jype prehitu
Zgodovina sprememb…
- spremenilo: l0g1t3ch ()
CCfly ::
Problem dopolnjujejo seveda še numerično nekoliko bolj zoprne operacije, kjer se zaokrožitvene napake množijo (tipično posebni primeri pri odštevanju in deljenju).
"My goodness, we forgot generics!" -- Danny Kalev
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Kako zaokrožiti? Cena brez davka + popust + DDV decimalkeOddelek: Programiranje | 4401 (3558) | kunigunda |
» | [Java] pomoč pri seminarskiOddelek: Programiranje | 2170 (1800) | dasf |
» | java Double.valueOfOddelek: Programiranje | 1414 (1308) | Spura |
» | [NALOGA] Java: RekurzijaOddelek: Programiranje | 956 (770) | Spura |
» | BigInteger-->BigDecimalOddelek: Programiranje | 949 (845) | FlashM |