Kezdőoldal » Számítástechnika » Programozás » Miért veszítek adatot a...

Ivan Iljics kérdése:

Miért veszítek adatot a castolásnál?

Figyelt kérdés

Kezdő vagyok eléggé (C++), valaki el tudná magyarázni hogy ez:

(int)(log(8-0)/log(2))


miért lesz a számítógépem szerint kettő?


2013. márc. 28. 22:42
 1/4 iostream ***** válasza:

A lebegőpontos számábrázolás nem pontos.

Ha lebegőpontosból egészet akarsz csinálni, akkor kerekíteni akarsz, nem csonkolni. Ezt úgy teheted meg pl, hogy hozzáadsz 0.5-t egésszé alakítás előtt.

2013. márc. 28. 23:17
Hasznos számodra ez a válasz?
 2/4 gyorki92 ***** válasza:

Az (int) castolás levágja a maradékot, nem kerekiti. 2,2 vagy 2,8 mindegy neki, 2 lesz belőlük, a maradék megy a levesbe.

Próbáld igy:

round(log(8)/log(2). a round() függvény a <cmath> headerben található. De te magad is irhatsz egy egyszerű egésszé kerekitő függvényt:

A számból kivonod az (int) castolt változatát a számnak, igy megkapod a maradékot. Ha az kisebb, mint 0.5, akkor az (int) castolt változatot adod visszatérési értékként, ha nem, akkor az (int) castolt változat+1-et.

2013. márc. 29. 13:12
Hasznos számodra ez a válasz?
 3/4 iostream ***** válasza:
Utolsó: nem véletlenül nem írtam, hogy használja az std::roundot. A cmath-ban nincs round. [link]
2013. márc. 29. 13:43
Hasznos számodra ez a válasz?
 4/4 gyorki92 ***** válasza:

Igaz, ezt benéztem.

Kicsit utánajártam, az előző kettő metódushoz (+0.5 a számhoz castolás előtt, illetve a maradékvizsgálatos) még hozzátennék annyit, hogy egyik sem működik csak igy magában negativ számra. Viszonylag könnyű módositani mindkettőt, hogy azokkal is a várt eredményt hozza.

2013. márc. 29. 15:46
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!