Tarkotuksena olis koodata javalla liukulukujen kertolasku-metodi (palauttaa myös vastauksena liukuluvun). Tuli matemaattinen ongelma eteen: pitäisi löytää joku sääntö minkä perusteella voi päätellä vastauksen (=tulon) eksponentin. Liukuluku on tässä tapauksessa siis muotoa: 0.x*10^y (x ja y kokonaislukuja, x on mantissa ja y on eksponentti). Ja oletetaan tässä vaiheessa liukuluvun olevan positiivinen. Eksponentti y voi olla negatiivinen.
Otetaan esimerkki: 0.2*10^2 * 0.33*10^5 = 0.66*10^6. Tästä voisi helposti päätellä että vastauksen eksponentin saa kun laskee kerrottavien eksponentit yhteen ja vähentään luvun 1 (tässä 2+5-1=6).
Toinen esimerkki: 0.55*10^2 * 0.66*10^4 = 0.363*10^6. Tässä sen saa kun laskee vaan kerrottavien eksponentit yhteen (2+4=6).
Oisko tässä joku semmonen logiikka, että kun mantissat kertoo yhteen ja uuden mantissan pituus on suurempi kuin kummankaan kerrottavan mantissa, eksponentti lasketaankin toisella tavalla (millä tavalla?)?
Menisiköhän niin, että jos ensin normalisoisi arvon (siis välille 1-9.99..), kertoisi arvot keskenään ja summaisi eksponentit. Eli:
0.2*10^2 * 0.33*10^5
2*10^1 * 3.3*10^4 = (2*3.3)*10^(1+4) = 6.6*10^5 = 0.66*10^6
0.55*10^2 * 0.66*10^4
5.5*10^1 * 6.6*10^3 = (5.5*6.6)*10^(1+3) = 36.3*10^4 = 3.63*10^5 = 0.363*10^6
Tässä vielä linkki:
http://en.wikipedia.org/wiki/Floating_point#Multiplication
2*10^1 * 33*10^3 = 66*10^4 = 0,66*10^6
55*10^0 * 66*10^2 = 3630*10^2 = 363*10^3 = 0,363*10^6
Kertolaskun osien järjestystä voi vaihtaa, joten (0,2 * 102) * (0,33 * 105) = (0,2 * 0,33) * (102 * 105) = 0,066 * 107. Siis mantissat kerrotaan keskenään ja eksponentit lasketaan yhteen. Jos mantissat ovat alun perin muotoa 0,x, niin tuloskin on muotoa 0,x.
Pienin 0,x-muotoinen luku on selvästikin 0,1, jolloin pienin mahdollinen tulo on 0,01. Onko aivan ylivoimaista käyttää yhtä if-lausetta?
// (a * 10^A) * (b * 10^B) = (c * 10^C) c = a * b; C = A + B; if (c < 0.1) { c = 10 * c; C = C - 1; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.