Kezdőoldal » Számítástechnika » Programozás » Hogyan kell érteni a C és C++...

Hogyan kell érteni a C és C++ nyelvekben azt, hogy egy float vagy egy double milyen pontosságú?

Figyelt kérdés

Ebben a táblázatban például az szerepel, hogy 7 digits, azaz 7 számjegy. De ez az utasítás pl 9-et ad vissza: std::cout << std::numeric_limits<float>::max_digits10 << '\n';

A 9-ből hogy lesz 7? Talán az előjel és a tizedespont miatt?

Itt azt írják, hogy ha szöveggé konvertáljuk, aztán pedig újra számmá, akkor ennyi számjegy pontosságú számot kapunk vissza: [link]

Viszont én megpróbáltam ezt megtenni, de a floatnál, a doublenál (nyilván az stof helyett stod függvényt használtam) is 7 számjegy volt a pontosság:

#include <iostream>

#include <string>


int main() {

float f_example = 0.123456789;

std::string str_example = std::to_string(f_example);

f_example = stof(str_example);


std::cout << f_example << '\n';

}



#pontosság #float #digits #stof #to_string
2021. ápr. 5. 13:22
 1/4 A kérdező kommentje:

A táblázat linke lemaradt a leírásból:

[link]

2021. ápr. 5. 13:23
 2/4 anonim ***** válasza:
17%
Ne gondold túl, annó úgy döntöttek, hogy annyit elég letárolni.
2021. ápr. 5. 13:37
Hasznos számodra ez a válasz?
 3/4 anonim ***** válasza:
100%

#2: nem arra gondoltak, 32 illetve 64 bitet tárol, baromságot mondasz.

Úgy értik a 7 illetve 15 számjegy pontosságot, hogy ami binárisan 56 bit, decimálisan kb. ennyi számjegyet reprezentál átlagosan egy törtben, ami még pontos érték.

Tehát például a 7 tizedes pontosságot úgy értsd:

vagy egy szám: 0.12345678910111213

Ezt letárolás után úgy látod, hogy 0.1234567xxxxxxxxxxx (ahol x tetszőleges nem releváns szám lehet, vagyis a 7-es utáni számok már nem az igazi értéket adják).

Így értsd. De ez csak átlagosan igaz, lehet olyan véletlenül épp egy szám, hogy 7 helyett 20 tiezedesjegyig is pontos, a decimális-bináris konverzió miatt.

2021. ápr. 5. 14:20
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:
53%

Elég nagy a kavarodás, úgy érzem, ezért hogy tiszta legyen:

Az IEEE754 a használt szabvány, ami definiálja a törtszámok számítógépes tárolását. Ennek két formátuma a legelterjedtebb, a 32 bites (single precision), és a 64 bites (double precision). (C-ben előbbi a float, utóbbi a double.)


A single precision-nél a 32 bitből az első az előjel, ezután 8 bit az exponens, a maradék 23 bit pedig a törtrész. Az exponenst és a törtrészt gyakorlatilag a középiskolából ismert normálalaknak megfelelően kell elképzelni: a törtrész megad egy egész számot, az exponens pedig a "tizedesvessző eltolását", persze mindezt binárisan. Ebből az következik, hogy a beírt szám precizitását nem a törtrész után kell értelmezni, hanem a legnagyobb helyiértékű bittől számítva, így az is lehet, hogy egyáltalán nem képes tizedes részt tárolni, vagy, akár az egészrész is veszíthet a pontosságából:


16777216.5 eltárolva:

16777216


167772165000 eltárolva:

167772160000


A single precision formátum 23 bitet ad a törtrész tárolására, de igazából a normálalak binárisan mindig 1-gyel kezdődik, és azt el lehet hagyni a tároláshoz, ezért 2^24 = 16777216 a legnagyobb eltárolható törtrész. Persze ezen kívül is lehetnek pontatlanságok, pl. 0.3 sosem lesz pontosan eltárolható binárisan, csak közelíteni lehet.


A 64 bites double precision formátum ugyanezt a mintát követi, csak értelemszerűen több bitet tud használni, így sokkal pontosabb.

2021. ápr. 5. 15:47
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!