» »

[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

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

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kako zaokrožiti? Cena brez davka + popust + DDV decimalke

Oddelek: Programiranje
184209 (3366) kunigunda
»

[Java] pomoč pri seminarski

Oddelek: Programiranje
82026 (1656) dasf
»

java Double.valueOf

Oddelek: Programiranje
81256 (1150) Spura
»

[NALOGA] Java: Rekurzija

Oddelek: Programiranje
5896 (710) Spura
»

BigInteger-->BigDecimal

Oddelek: Programiranje
8890 (786) FlashM

Več podobnih tem