Hogyan kell érteni a C és C++ nyelvekben azt, hogy egy float vagy egy double milyen pontosságú?
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';
}
#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.
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.
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!