Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Liukulukujen kertolasku

Palvy [11.03.2008 21:18:55]

#

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?)?

Pöytälamppu [11.03.2008 21:45:10]

#

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

kayttaja-2499 [11.03.2008 21:46:43]

#

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

Antti Laaksonen [11.03.2008 22:09:35]

#

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.

Metabolix [11.03.2008 22:15:17]

#

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;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta