Avatar billede jespersahner Nybegynder
11. november 2004 - 17:28 Der er 7 kommentarer og
1 løsning

Når man regner med Double.MIN_VALUE

Jeg har et program, hvor jeg gerne vil tage hensyn til "missing values" (altså tal der ikke er sat til noget), hvilket jeg gør ved at sætte dem til Double.MIN_VALUE. Sådanne tal skal man selvsagt ikke regne videre på, men gør man det alligevel, får man nogle spøjse resultater, jf. nedenfor:

System.out.println(0.0+Double.MIN_VALUE);
System.out.println(1.0+Double.MIN_VALUE);
System.out.println(0.5*Double.MIN_VALUE);
System.out.println(0.6*Double.MIN_VALUE);
- giver flg. output:
4.9E-324
1.0
0.0
4.9E-324

Gør man det samme med Integer.MIN_VALUE er der ingen problemer, altså:
System.out.println(0+Integer.MIN_VALUE);
System.out.println(1+Integer.MIN_VALUE);
System.out.println((int)(0.5*Integer.MIN_VALUE));
System.out.println((int)(0.6*Integer.MIN_VALUE));
- giver:
-2147483648
-2147483647
-1073741824
-1288490188

Hvad er logikken omkring Double.MIN_VALUE?
Avatar billede arne_v Ekspert
11. november 2004 - 19:18 #1
Double.MIN_VALUE er den mindste positive double man kan have. Ikke den mindste
negative (den er -Double.MAX_VALUE).

Det skal nok passe at 4.9E-324 er den mindste double større end nul.

1 + et så lille tal giver naturligvis 1

0.5 * det tal giver nul (det er jo enten nul eller det oprindelige tal)

0.6 * det tal giver det oprindelige tal (det er jo enten nul eller det oprindelige tal)

Så det ser meget rigtigt !
Avatar billede jespersahner Nybegynder
11. november 2004 - 20:02 #2
->arne_v: Jamen, det er jo ganske rigtigt! I farten troede jeg, at Double.MIN_VALUE var defineret på samme måde som Integer.MIN_VALUE, Long.MIN_VALUE osv., men du har jo ganske ret! Lidt pinligt at man ikke kan genkende 4.9E-234 som et lille positivt tal og ikke et stort negativt tal, når man i øvrigt er matematisk uddannet! :-)

I øvrigt kan jeg se, at man vedr. Double har en række specielle konstanter Double.NaN, Double.NEGATIVE_INFINITY og Double.POSITIVE_INFINITY, som jeg givetvis vil kunne bruge i relation til "missing values".

Tak!
Avatar billede arne_v Ekspert
11. november 2004 - 20:18 #3
NaN er et godt bud på en missing value.

Alternativet var nok at bruge Double fremfor double, fordi en Double kan være null.
Avatar billede arne_v Ekspert
11. november 2004 - 20:18 #4
OK med et svar ?
Avatar billede jespersahner Nybegynder
11. november 2004 - 20:29 #5
->arne_v: Jeg har haft samme tanke men er umiddelbart lidt bange for disse wrapper-udgaver ved meget store beregninger pga. performance, men det er måske ubegrundet (?)
Avatar billede arne_v Ekspert
11. november 2004 - 20:31 #6
Nej. Jeg tror også at double og NaN er betydeligt hurtigere end Double og null.
Avatar billede jespersahner Nybegynder
11. november 2004 - 20:42 #7
->arne_v: Enig omkring Double.NaN. Har lige checket at Double.POSITIVE_INFINITY og Double.NaN heldigvis også behandles rigtigt, når de skrives ud i en binær fil og læses ind igen.
Avatar billede arne_v Ekspert
11. november 2004 - 20:51 #8
Der er simpelthen sat nogen bit mønstre af til formålet i IEEE standarden.

Så ingen problemer med at skrive og læse til og fra en binær fil.

Tal skrevet fra et Java program vil også kunne læses af et C++ program
og stadig være NaN.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester