[Java] Fundering kring precisionen på double

Permalänk

[Java] Fundering kring precisionen på double

Jag sitter och knåpar på en app för Android och har stött på problem när jag använder typen double i matematiksammanhang, närmare bestämt trigonometri.

Exempel: multiplikationen 0.01*cos(1.5) ger resultatet 7.07372, fast det korrekta svaret skall vara 0.000707372,
men däremot ger 0.02*cos(1.5) korrekt svar, 0.0014147. (Vinklarna i radianer)

Det verkar som om double i Java inte kan hantera lägre tal än 0.001, vilket ter sig mycket märkligt.
Måste jag använda BigDecimal för att lösa detta, eller hur tusan gör man?

Permalänk
Medlem

Troligen är det så att den kommer över en gräns.. när jag skrev ihop lite snabbt fick jag svaret 7.073720166770291E-4 vilket är 0.000703.. fast med annan notation (10^-4). Tror dom satt en gräns helt enkelt där den börjar skriva på det sättet ist för att skriva ut alla nollor efter kommatecknet.

Permalänk
Medlem

Som sagt, inget fel på värdet, bara utskriften som börjar använda E för 'tio-exponenten', precis som miniräknare gör.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Jag tror double i java har 11 bitar för exponenten, vilket ger dig 2^11 olika expontenter. Således är doubles minsta tal 2^-(2^6) och högsta 2^(2^5)
(exponenterna jämnt utspridda runt 0:an).
Alltså är dubbles största tal 4294967296
och minsta tal 5.4210... × 10^-20
Edit:
10 ska vara 11

Visa signatur

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || MSI NVIDIA RTX 2070 Gaming Z 8GB || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || BeQuiet DarkRock Pro

Permalänk

Joo, det låter logiskt det ni säger. Kanske de sista decimalerna plus strängen "E-4" inte syns längst till höger i formelementet (som är en TextView). Jag får prova att begränsa antalet tecken i TextView'n, så kanske "E-4" kommer med. Vill man prompt ha utskriften på formen "0.000707372", så antar jag att man får koda in en egen konverterare.

Tack iaf. för snabba, bra svar.

Permalänk
Medlem

Ett alternativ kan ju vara att skippa double/float, och använda sig av andra alternativ.
Ta en titt här kanske?
http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDec...

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av lollol7:

Jag tror double i java har 10 bitar för exponenten, vilket ger dig 2^11 olika expontenter.

Inte 2^10 olika då?

Permalänk
Medlem
Skrivet av TheRealNyllet:

Joo, det låter logiskt det ni säger. Kanske de sista decimalerna plus strängen "E-4" inte syns längst till höger i formelementet (som är en TextView). Jag får prova att begränsa antalet tecken i TextView'n, så kanske "E-4" kommer med. Vill man prompt ha utskriften på formen "0.000707372", så antar jag att man får koda in en egen konverterare.

Tack iaf. för snabba, bra svar.

Du behöver nog inte koda något eget, använd antingen DecimalFormat eller string.format när du gör om doublen till en sträng så kan du själv ange vilket format det ska bli.

Permalänk
Medlem
Skrivet av htux:

Inte 2^10 olika då?

2^11, men skrev fel på 10:an.

Visa signatur

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || MSI NVIDIA RTX 2070 Gaming Z 8GB || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || BeQuiet DarkRock Pro

Permalänk
Inaktiv
Skrivet av TheRealNyllet:

Joo, det låter logiskt det ni säger. Kanske de sista decimalerna plus strängen "E-4" inte syns längst till höger i formelementet (som är en TextView). Jag får prova att begränsa antalet tecken i TextView'n, så kanske "E-4" kommer med. Vill man prompt ha utskriften på formen "0.000707372", så antar jag att man får koda in en egen konverterare.

Tack iaf. för snabba, bra svar.

Skall du skriva någon slags app så kanske du vill begränsa dig till typ 2 decimaler. Är man verkligen intresserad av fler så gör wolfram alphas mobila hemsida ett bättre jobb