Miért hoz ki pontos végeredményt? (C, lebegőpontos számolás)
Vegyünk két számot, amit a C nem tud pontosan reprezentálni, például 0.24, ami a valóságban úgy fog kinézni, hogy
0.23999999999999999111821580299874767661094665527344
Meg a 0.01-et, ami
0.01000000000000000020816681711721685132943093776703
Ha ezt összeadom, akkor miért hozza ki a pontos 0.2500.... eredményt?
Néztem mit írsz, csak ránézésre se elég pontos már ha arról beszélünk hogy valóságban hogy néz ki.
A tíz és a kettő között van ötszörös különbség. Pontosan nem megyek bele, de mivel a gép az kettes számrendszerbe számol és a véges pontosságú kettes számreprezentációs képét ha addig szorozzuk 10-el amíg egész nem lesz akkor a kapott egész 5-el oszthatónak kell lennie.
Ezért a 0.24 képe 10-esbe átírva lebegőpontosan 64 biten 53 bit bináris mantisszával 0.2399999999999999911182158029987476766109466552734375
0.01 képe pedig 0.01000000000000000020816681711721685132943093776702880859375.
-------
0b-vel kezdem a számot ha binárisan írom fel, a szokásos módon írom ha decimálisan írom fel.
Az ábrázolt szám lebegőpontosan van ábrázolva ahol 64 biten (lehet más bitszámon is, de ez egy standard) amiből 53 bit a mantissza a többi meg a exponensnek , előjelnek van fenntartva, meg +/- végtelen meg nan érték-nek is van fenntartva ábrázolási lehetőség, de ez most részletkérdés.
0.24 => 0b00011110101110000101000111101011100001010001111010111 * 2^-52
0.01 => 0b10100011110101110000101000111101011100001010001111011 * 2^-59
Az összeadáskor az exponensek függvényében helyiérték őrzően összeadjuk a két szám mantisszáját 53 bitesre kerekítve, összeadjuk mint 2 egész számot.
vagyis a helyiérték korrekció után ezt kapjuk
0b000111101011100001010001111010111000010100011110101110000000
0b000000010100011110101110000101000111101011100001010001111011
53 bitesre kerekítjük a bináris kerekítési szabály szerint. Vagyis ezt a 2 egész számot kapjuk amit össze kell adni:
0b00011110101110000101000111101011100001010001111010111
0b00000001010001111010111000010100011110101110000101001
összeadás után ezt kapjuk:
0b100000000000000000000000000000000000000000000000000
az eredmény ennyiszer 2^-52, vagyis az exponens -52.
Szabvány szerint át kell alakítani hogy 1-re végződjön a mantissza (amit okosan nem is tárolnak el pont e miatt egyébként az IEE 754-es szabvány szerint, hiszen minek ha vakon tudjuk hogy 1) ezért addig léptetjük míg egy nem lesz vagyis 1 lesz a mantissza -2 az exponens vagyis 1*2^-2 = 0.25 abszolút pontosan. A 0.25 képét pontosan ábrázolja triviálisan mivel 2 hatványa.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!