Problem Med Lommeregner, Double Og Kvadratrod

Tags:    java

Hellow guys..

Jeg har lavet en low quality lommeregner, med min low quality hjerne. Jeg har bare stille og rolig lavet den, startet med plus, minus, divideret og gange, gået op til at kunne slette, clear, kvadratrod.. Så besluttede jeg mig for at lave den om til at kunne bruge decimal tal.. Det var ikke så svært, istedet for int skulle det da bare være double eller float.. Jaaa-nej, det var ikke bare lige sådan, den kan da godt regne med double, lige på nær kvadratrods funktionen.. I made something wrong, men efter at have rettet alle de fejl jeg kunne finde, er mit problem altså stadig ikke helt løst..

Nogen som kan hjælpe mig ud her?

Fold kodeboks ind/udJava kode 




5 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 23 karma
Sorter efter stemmer Sorter efter dato
Math.sqrt(X)



Der forskellige ting der er problematiske i din udregning:

Fold kodeboks ind/udJava kode 


1. For det første er det en meget ineffektiv måde at udregne det. Hvis jeg nu skrev 10000.0 vil den potentielt bruge 100000 iterationer. Men den ville selvfølgelig finde svaret meget hurtigere (efter 1000) iterationer...

2. Men du tjekker kun hvert 0.1 så det er ikke engang sikkert at den rammer den rigtigt værdi, f.eks. kvadratroden af 2.0 er omkring 1.41 hvilket 0.1 jo ikke går op i...

3. Og så nok det vigtigste. Floating point tal (Float og Double) er IKKE præcise!. Du kan ikke altid regne med at f.eks. 4.0-1.0 == 3.0 i floating point beregninger, hvorimod hos heltal vil det altid være tilfældet at 4-1 == 3.

Så hvad har du af muligheder? Brug den indbyggede Math.sqrt som Benni foreslår - eller find en algorithme der finder kvadratroden af et tal (f.eks. wikipedia).

Som sagt kan du ikke regne med floating point sammenligninger, så hvordan sammenligner man float og doubles? En typisk måde er at bruge en epsilon værdi. Hvis du vil tjekke om to floating point tal er lig med hinanden gjorde du før x == y. I stedet før du abs (x - y) < 0.1. Hvis forskellen mellem de 2 tal er mindre en 0.1 (epsilonværdien) betragtes de som ens. abs er en funktion der altid sørger for et tal er positivt, f.eks. abs(5) = 5, abs(-5) = 5. På den måde kan du sammenligne floating point værdier. Epsilon værdien er dog stadig problematisk for hvad skal den være? Hvis arbejder med tal som x = 53431434.34 og 123123213.34 er 0.1 nok en rimelig værdi, men hvis dine tal er x = 0.14, y = -0.05 er 0.1 en alt for stor epsilon værdi.



Indlæg senest redigeret d. 25.09.2012 00:35 af Bruger #14645
Math.sqrt() funktionen returnere svaret - Den tildeler ikke variablen svaret. Derfor skulle din kode formentlig snarere være lig:
Fold kodeboks ind/udJava kode 


og kunne formentlig også skrives kortere:
Fold kodeboks ind/udJava kode 




Der forskellige ting der er problematiske i din udregning:

Fold kodeboks ind/udJava kode 


1. For det første er det en meget ineffektiv måde at udregne det. Hvis jeg nu skrev 10000.0 vil den potentielt bruge 100000 iterationer. Men den ville selvfølgelig finde svaret meget hurtigere (efter 1000) iterationer...

2. Men du tjekker kun hvert 0.1 så det er ikke engang sikkert at den rammer den rigtigt værdi, f.eks. kvadratroden af 2.0 er omkring 1.41 hvilket 0.1 jo ikke går op i...

3. Og så nok det vigtigste. Floating point tal (Float og Double) er IKKE præcise!. Du kan ikke altid regne med at f.eks. 4.0-1.0 == 3.0 i floating point beregninger, hvorimod hos heltal vil det altid være tilfældet at 4-1 == 3.

Så hvad har du af muligheder? Brug den indbyggede Math.sqrt som Benni foreslår - eller find en algorithme der finder kvadratroden af et tal (f.eks. wikipedia).

Som sagt kan du ikke regne med floating point sammenligninger, så hvordan sammenligner man float og doubles? En typisk måde er at bruge en epsilon værdi. Hvis du vil tjekke om to floating point tal er lig med hinanden gjorde du før x == y. I stedet før du abs (x - y) < 0.1. Hvis forskellen mellem de 2 tal er mindre en 0.1 (epsilonværdien) betragtes de som ens. abs er en funktion der altid sørger for et tal er positivt, f.eks. abs(5) = 5, abs(-5) = 5. På den måde kan du sammenligne floating point værdier. Epsilon værdien er dog stadig problematisk for hvad skal den være? Hvis arbejder med tal som x = 53431434.34 og 123123213.34 er 0.1 nok en rimelig værdi, men hvis dine tal er x = 0.14, y = -0.05 er 0.1 en alt for stor epsilon værdi.


Okay, har prøvet med Math.sqrt(); istedet, men hvis jeg taster 9 ind, så bliver resultatet bare 9.0, hvis jeg taster 9.0 ind, bliver resultatet stadig 9.0, det samme hvis jeg gør det med tallet 20, osv, osv, osv.

Fold kodeboks ind/udJava kode 





Mange tak, nu virker det!



t