Kun kerron integerin doublella, siitä tulee double, mutta miten saan sen takaisin integeriksi?
double a = 1.5f; int b = 3; printf("a * b = %d", (int)(a * b + 0.5f));
Tuo puolikkaan lisääminen tekee sen, että pyöristys menee 0.5 -> 1. Pelkkä intiksi castaaminen katkaisee luvun desimaalipilkun kohdalta. Esim. (int)(4.9f) -> 4.
Lieneekö tehokkaampaa castata ensin tuo double intiksi, ja sitten kertoa int*int? Tarkkuushan siinä mahdollisesti kärsii ainakin.
Claw kirjoitti:
Lieneekö tehokkaampaa castata ensin tuo double intiksi, ja sitten kertoa int*int? Tarkkuushan siinä mahdollisesti kärsii ainakin.
tuolla tavalla 1,5 * 3 = 3 kyllähän se tarkkuus siinä hieman kärsii...
Mitä suurempi se double on, sitä vähemmän tarkkuus kuitenkin kärsii. Mutta eipä tunnu olevan kovin kannattavaa muutenkaan, n. 18 - 21 % nopeammalta vaikutti tuo castaaminen ennen laskemista, kun että lasketaan pelkillä doubleilla (tässä alkup. tapauksessahan lasketaan int*doube kylläkin).
Tokihan tuota epätarkkuutta voidaan mahdollisesti kompensoida sillä, että käytetään suuria doubleja ja pieniä kertoimia niille, jos vaan mahdollista.
Ehkä kuitenkin järkevintä castata se tulos. :P
Jos laskutulosta käytetään vain tulostukseen, voi doublesta jättää desimaalit pois, pyöristipä stten ylös- tai alaspäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.