Avatar billede dsj Nybegynder
16. december 2004 - 11:10 Der er 9 kommentarer og
1 løsning

Hvorfor tillades division med 0

Under normale omstændigheder er division med 0 ikke en tilladt operation, og følgende udtryk (division mellem to integers) vil da også smide en ArithmeticException:

int result = 1000000 / 0;

Men hvis vi gør det ene tal i udtrykket til en double/float, sker der noget andet:

double result = (double) 1000000 / 0;

Her vil 'result' indtage værdien "Infinity" UDEN en ArithmeticException smides. For det første kan jeg ikke forstå, hvordan et tal kan være uendeligt, og for det andet kan jeg ikke forstå at divisionen med 0 tillades - nogen der har et bud?
Avatar billede arne_v Ekspert
16. december 2004 - 11:12 #1
IEEE standarden for floating point (som Java følger) har et bit mønster for
uendelig.
Avatar billede dsj Nybegynder
16. december 2004 - 11:18 #2
Men burde den ikke brokke sig over divisionen med 0, eller tillader den det, netop fordi double/float kan indtage Infinity-værdien?
Avatar billede arne_v Ekspert
16. december 2004 - 11:18 #3
Hvorfor er jo altid et godt spørgsmål !

Forslag:

floating point tal er jo ikke eksakte

måske giver det mening at sige at

et tal mellem 999999.9999999999 og 1000000.00000000001 divideret med
et tal mellem -10^300 og +10^300 bedste repræsenteres ved uendelig
værdien
Avatar billede arne_v Ekspert
16. december 2004 - 11:29 #4
^-300 selvfølgelig

:-)
Avatar billede dsj Nybegynder
16. december 2004 - 11:36 #5
Ja, jeg mente nok at have hørt, at double/float typerne ikke er præcise i den forstand...
Avatar billede dsj Nybegynder
16. december 2004 - 12:26 #6
Du må godt lægge et svar...
Avatar billede arne_v Ekspert
16. december 2004 - 12:28 #7
svar
Avatar billede arne_v Ekspert
16. december 2004 - 12:31 #8
float og double er fremragend etil det som de er beregnet til.

Det giver jo ingen mening at diskutere om man har 45 km til arbejde eller
45.00001 km til arbejde (forskellen er 1 cm og hverken hjem eller arbejde
er præcist nok defineret til at 1 cm giver mening).

Man skal bare ikke bruge float/double til eksakte ting. 123.45 kroner er
præcis det og ikke 123.44999 krone.
Avatar billede dsj Nybegynder
16. december 2004 - 12:34 #9
Det er BigDecimalg og BigInteger fra java.math, man skal bruge til eksakte ting?
Avatar billede arne_v Ekspert
16. december 2004 - 12:44 #10
BigDecimal ja. Java har ikke nogen primitiv data type til det (som C# decimal).
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

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