Kezdőoldal » Számítástechnika » Programozás » Miért hoz ki pontos végeredmén...

Ozmium42 kérdése:

Miért hoz ki pontos végeredményt? (C, lebegőpontos számolás)

Figyelt kérdé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?


2019. jún. 19. 19:15
 1/3 anonim ***** válasza:
48%
Mert mind a két számot pontosan tudja reprezentálni.
2019. jún. 19. 19:31
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:
Milyen más eredményt kaphatnál? Váltsd át mindkét számot binárisba és nézd meg mi történik... A 0,25 az pont egy szép kerek szám 0.01 vagy 1*2^-2 FP-ben ez szép kerek lesz. El fognak tűnni a kerekítési hibák. Nézd meg a saját számaidat is (bár nem tudom ez hogy jött ki, nekem egészen más érték jön ki) a 0.24 az kb. 1 bittel van lefelé kerekítve, a 0,01 meg 1 bittel felfelé van nálad kerekítve (LSB-n az FP számábrázolás végén) tehát az összeadásod így fog kb. kinézni: 0,24-2^-H+0,01+2^-H és így a két hiba pont 0 lesz a végén. Ennél jobban nem tudom elmondani kb. 20 éve tanúltam ezt utoljára ilyen alacsony szinten, azóta nem foglalkoztam vele érdemben.
2019. jún. 19. 21:59
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:

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.

2019. jún. 20. 11:52
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!