16. februar 2010 - 14:08Der er
17 kommentarer og 1 løsning
BigDecimal - praktisk brug
Kære Eksperter,
Jeg ønsker at udføre nogle simple regneoperationer på nogle meget små tal (a la 0.0000000000000000007456320237308473), men med meget høj præcision.
Jeg har et program, hvor jeg har en værdi b, fra et kald til en regnemetode.
Jeg ønsker at beregne a=a+b/c med højest mulig nøjagtighed.
a og c er defineret som double. Det er b også
i) hvordan laver jeg dem om til BigDecimal tal? ii) hvordan udfører jeg regneoperationerne? iii) b fremkommer ved at jeg kalder en ekstern metode og får returneret svaret, som så lægges i b - skal b også være BigDecimal?
Vh.
nanders
(det er vist noget med at tallene skal laves om til objekter)
Jeg vil meget gerne fortsætte med at bruge double, da en 800-900 variable i min model er erklæret som doubler.
Da jeg ikke er særlig stærk i at implementere constructorer, og nye metoder, ville jeg være meget taknemmelig, om en af jer kunne give et meget simpelt kode eksempel på
a) hvordan jeg erklærer variable b) hvordan jeg udfører simple regneoperationer med disse.
a) hvad er fejlen med min System.out b) lægger jeg tallene korrekt sammen, eller skal jeg inde i parantesen for a.add(b) istedet skrive noget andet?
Koden er her:
import java.util.*; //General utilities import java.io.*; //For the fileoutputstream function. import java.util.Date; //The date function preventing overwriting issues import java.text.*; //Used in printing import java.math.BigDecimal;
public class test { BigDecimal a = new BigDecimal ("2"); BigDecimal b = new BigDecimal ("6"); BigDecimal c = new BigDecimal ("13"); BigDecimal d = new BigDecimal ("73");
BigDecimal r = a.add(b); BigDecimal s = a.add(b).add(c);
Følgende programstump og udskrift illustrerer problemet
Spm. er dog, hvorfor den alm. sammenlægning af x+y nu giver et korrekt resultat?
Har dog haft store problemer med regnefejl på simple regneoperationer.
PROGRAM:
import java.math.BigDecimal;
public class test {
public void run() { BigDecimal a = new BigDecimal ("0.00000000000000000000001111111111111111"); BigDecimal b = new BigDecimal ("0.00000000000000000000002222222222222222");
double x = 0.00000000000000000000001111111111111111; double y = 0.00000000000000000000002222222222222222; double z = x+y;
BigDecimal r = a.add(b); BigDecimal s = a.add(b);
System.out.println("test double x: " + new BigDecimal(x)); System.out.println("test double y: " + new BigDecimal(y)); System.out.println("test1 double x + double y: " + new BigDecimal(x).add(new BigDecimal(y))); System.out.println("test2 double x + double y: " + (x+y));
test double x: 1.111111111111111001844422748649926507651390917293669297574544639443938631728769905748777091503143310546875E-23 test double y: 2.22222222222222200368884549729985301530278183458733859514908927888787726345753981149755418300628662109375E-23 test1 double x + double y: 3.333333333333333005533268245949779522954172751881007892723633918331815895186309717246331274509429931640625E-23 test2 double x + double y: 3.333333333333333E-23 test BDa: 1.111111111111111E-23 test BDb: 2.222222222222222E-23 test a+b '.add()': 3.333333333333333E-23
Det er fordi, at jeg 100x i sekundet skal beregne faseovergangs rater for gasser ind i vædsker, vækstrater for bakteriegrupper, omsætning af stoffer, vandbevægelser mv. i et biologisk system, som jeg har lavet en model af i Java.
Det er meget vigtigt, at der ikke overføres hverken mere eller mindre, end det rent faktisk er tilfældet mellem en gas- og vædske fase.
Har læst, at man inden for f.eks. økonomi også bruger BigDecimal.
Jeg tænker blot, om den unøjagtighed der er, som vist ovenfor, bliver større og større, eller om der er en normal fordeling af regnefejlen, så a+b > (korrekt a+b) nogle gange og a+b < (korrekt a+b) andre gange, når man regner a+b ud gentagne gange i det samme edb-program.
Overordnet består mit problem i, at jeg ikke ved nok om de forskellige simple typer (double, float, int) osv. i Java og edb-maskiner generelt.
Ville det f.eks. være bedre hvis min PC var 64 bit og ikke 32 bit. Jeg tænker om 32 vs. 64 bit siger noget om hvorvidt tal skrives og beregnes med 32 stk. 0 og 1 taller når det er 32 bit og 64 stk. 0 og 1 taller når det er 64 bit?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.