Konwersja z int na float

Konwersja z int na float
R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Czy można konwertować int na float bez żadnych konsekwencji ?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
5

Nie, z reguły sizeof(int) == sizeof(float), co oznacza, że float ma mniejszą precyzję. Np. na moim systemie float ma 23 bity mantysy:

Kopiuj
<@KrzaQ> { int a = (1 << 25) + 1; float b = a; cout << fixed << a, b; }
<+cxx> 33554433, 33554432.000000
R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Nie rozumiem, kiedy rzutuję na swoich komputerze z int na float to nic się nie zmienia.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Jeśli nie wychodzisz poza precyzję float to się nie zmienia.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

A kiedy mogę wyjść poza precyzję?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

Kiedy masz więcej bitów znaczących niż ma mantysa twojego floata. Tak jak pokazałem to na przykładzie.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

A czym są te bity znaczące?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

To binarne cyfry znaczące liczby, którą chcesz reprezentować.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Czyli mantysa?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

Chyba się nie rozumiemy. Mantysa musi mieć więcej lub tyle samo bitów co liczba, którą chcesz reprezentować, a więc liczba, którą chcesz reprezentować nie może mieć więcej bitów znaczących niż mantysa floata.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Mantysa float ma 23 bity a int do 31 chyba więc to dlatego nie można rzutować?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Tak jest. Chyba, że masz pewność, że wartości są bezstratnie reprezentowalne przez oba typy.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Tylko nie rozumiem dlaczego jak wpisuje dwa miliardy i rzutuje na float to nic nie zmienia.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

2000000000 to binarnie 1110111001101011001010000000000. Jak widać, cyfr znaczących jest 21.

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

A jak utworzyć taką liczbę?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

Nie rozumiem. Jaką liczbę chcesz utworzyć i po co?

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 157
0

Taką w której będzie więcej niż 23 cyfry znaczące.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

no po prostu sobie utwórz taką, w której są 24 lub więcej cyfry znaczące. Czyli po obcięciu zer zostają 24 cyfry. Np. 2 000 000 001 to 11101110011010110010100000000012

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
1

Nie można rzutować bez konsekwencji bo każda zmiennoprzecinkowa ma błąd niedomiaru albo nadmiaru przy operacjach, (zależy czy float czy double)

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

Nie przesadzajmy z każda. Tak długo jak nie wychodzisz poza precyzję (czyli np. w dziedzinę niereprezentowalnych liczb) błędu nie ma. Np.

Kopiuj
double a = 2, b = 2, c = 2, d = 6;
assert(a * b + c == d);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.