Jak jest zapisywana liczba 1.0?

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".

0

A jaką liczbę wg Ciebie reprezentuje:

00...0001

?

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.

0

Dlaczego nie sprawdzisz?

#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);
}
C:\PP\myprogs>a
 float 1.0 : 3f800000
double 1.0 : 3ff0000000000000
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1