Jak jest zapisywana liczba 1.0?

Jak jest zapisywana liczba 1.0?
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie potrafię znaleźć w internecie (albo znalazłem i nie potrafię zrozumieć). Naturalnym kandydatem jest ciąg samych zer: bit znaku jest równy 0, mantysa jest równa 1, wykładnik jest równy 0, zatem dostajemy (-1)0120 = 1. Ale ciąg samych zer reprezentuje zero "dodatnie".

LN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1398
0

A jaką liczbę wg Ciebie reprezentuje:

Kopiuj
00...0001

?

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Wg standardu kolejność jest taka: bit znaku, wykładnik, mantysa. Zatem (1+1/2n). n zależy od ilości bitów przydzielonych mantysie.
Jeżeli stosujesz inna konwencję: bit znaku, mantysa, wykładnik, to 2.
Zapamiętywana jest tylko część ułamkowa mantysy.

LN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1398
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Dlaczego nie sprawdzisz?

Kopiuj
#include <stdio.h>

union ufloat  { float f; unsigned long u; };
union udouble { double d; unsigned long long u; };

int main()
{
   union ufloat uf;
   union udouble ud;

   uf.f = 1.0f;
   ud.d = 1.0;

   printf(" float 1.0 : %lx\n", uf.u);
   printf("double 1.0 : %llx\n", ud.u);
}
Kopiuj
C:\PP\myprogs>a
 float 1.0 : 3f800000
double 1.0 : 3ff0000000000000
rincewind
  • Rejestracja: dni
  • Ostatnio: dni
1

Musisz pamiętać, że w IEEE754 wykładnik jest kodowany w U1, czyli odejmowany jest tzw. bias. Dla single precision wykładnik ma 8 bitów o wartości 0..255, ale rzeczywista jego wartość wyliczana jest przez odjęcie 127. Dlatego dla liczby 1.0 wykładnik ma wartość bitową 127 (01111111)2, co po odjęciu biasu daje rzeczywistą wartość 0.

Edit Generalnie dla n-bitowej eksponenty bias wynosi 2(n-1)-1, więc dla podwójnej precyzji, gdzie eksponenta ma 11 bitów bias jest równy 1023.

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.