Kratko - zašto int ovako reže decimale floata?

poruka: 5
|
čitano: 1.550
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
6 godina
neaktivan
offline
Kratko - zašto int čudno reže decimale floata?

zašto ovo vraća rezultat  = 0.123398 ,

 

umjesto normalno x - (int) x =  88.1234 - 88 = 0.1234 ?

 

 

    #include <iostream>
    using namespace std;

    int main() {
    float x = 88.1234;
    float dec;
   dec = x - (int) x ;
        cout <<dec <<endl;  // ispisuje 0.123398 ??
        }

 
0 0 hvala 0
9 godina
neaktivan
offline
Kratko - zašto int ovako reže decimale floata?

Zbog nacina na koji se float fizicki zapisuje u memoriji, neke brojeve je jednostavno nemoguce zapisati u float obliku pa su zapisuje najblizi broj koji se moze zapisati.

 

Npr. od svih brojeva sa jednom decimalom, samo 0.5 mozes zapisati u float obliku, 0.6, 0.7, 0.8, 0.9 ne mozes. Ali zato 0.75 opet mozes, ili 0.875.

 

Razlog tome ti je sto u mantisi svaki iduci bit u IEEE745 reprezentaciju floata ima duplo manju vrijednost. Prvi bit ima vrijednost 0.5, drugi 0.25, treci 0.125...  zbog toga mozes tocno zapisati 0.75 (0.5 + 0.25) ili 0.875 (0.5 + 0.25 + 0.125)  ali ne i 0.8.

 

 

Ako gledas bitove u ovo programu mozes vidjeti kako to funkcionira:

https://www.h-schmidt.net/FloatConverter/IEEE754.html

 

Upises u "You entered:" broj 1.5 i igras se dalje sa bitovima mantise da vidis kak funckionira. Ako upises neki broj koji se ne moze zapisati u float obliku, npr. 0.8, onda ti u polje ispod prikaze koji je broj stvarno zapisan u memorije.

 

 

Poruka je uređivana zadnji put sri 10.10.2018 11:20 (DanijelX).
Moj PC  
0 0 hvala 2
12 godina
offline
Kratko - zašto int ovako reže decimale floata?

Kolega je objasnio, ja ću još samo dodati (možda će ti biti korisno) da se zbog toga decimalne brojeve ne uspoređuje sa ==, tipa if(mojBroj == 0.4) { // do something }, nego se gleda je li im razlika manja od nekog jakog malog broja, u ovom slučaju 0.000001 if(mojBroj - 0.4 < 1e-6) { // do something}

http://25.media.tumblr.com/tumblr_makcziBKrN1ryi1myo1_500.gif
Moj PC  
0 0 hvala 1
6 godina
neaktivan
offline
Re: Kratko - zašto int ovako reže decimale floata?

kužim,. onda zadatke tipa "razdvoji cijeli dio i decimalni dio broja" kao ovdje ispod,

 

možemo tj moramo sa double, ovako - vidim sad ispisuje točno rez. 0.1234

 

 

#include <iostream>
using namespace std;

int main()
{
   double x = 88.1234;
   double dec;
   dec = x - (int) x ;
        cout <<dec <<endl;
}

 

12 godina
offline
Kratko - zašto int ovako reže decimale floata?

Da, double format se zapisuje u 64bita, dok se float zapisuje u 32 bita. Budući da ima više prostora, ima i veću preciznost (Zato se i zove Double-precision floating-point format).

Samo što bi single-precision trebao garantirat preciznost do sedme znamenke, a double-precision to 16te (nisam 100% siguran u brojke), pa nisam siguran zašto se tebi poremeti već na četvrtoj decimali.

 

edit: Skužio sam ja, zaboravio sam da je početna vrijednost x = 88.1234, što se onda zapisuje kao 88.123398, pa pošto od toga oduzimaš 88 dobiješ rezultat 0.123398.

Znači, nije ti bitan samo broj decimala, nego i broj znamenki prije decimalne točke.

Ako pokušaš ispisat samo x, dobit ćeš 88.123398. Ako promjeniš u float x = 0.1234; i ispišeš x, dobit ćeš 0.123400.

I da prokomentiram naslov teme, castanje u (int) tu nema nikakvu ulogu.

http://25.media.tumblr.com/tumblr_makcziBKrN1ryi1myo1_500.gif
Poruka je uređivana zadnji put sri 10.10.2018 20:42 (KiCo77).
Moj PC  
1 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice