Это не вопрос MATLAB. 64-битный двоичный формат с плавающей запятой двойной точности IEEE 754 представлен в следующем формате:
bit layout:
| 0 | 1 | 2 | ... | 11 | 12 | 13 | 14 | ... | 63 |
| sign | exponent(E) (11 bit) | fraction (52 bit) |
Первый бит - это знак:
0 => +
1 => -
Следующие 11 бит используется для представления экспоненты. Таким образом, мы можем иметь целые числа вплоть до + 2 ^ 10-1 = 1023. Подождите ... звучит не очень хорошо! Для представления больших чисел используется так называемая смещенная форма , в которой значение представлено как:
2^(E-1023)
, где E - то, что представляет экспонента. Скажем, биты экспоненты похожи на эти примеры:
Bit representation of the exponent:
Bit no: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Example 1: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Example 2: | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
Example 3: | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Example 4: | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
Example 5: | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Base 10 representation:
Example 1 => E1: 1
Example 2 => E2: 32
Example 3 => E3: 515
Example 4 => E4: 2046
Example 5 => E4: Infinity or NaN (**** Special case ****)
Biased form:
Example 1 => 2^(E1-1023) = 2^-1022 <= The smallest possible exponent
Example 2 => 2^(E2-1023) = 2^-991
Example 3 => 2^(E3-1023) = 2^-508
Example 4 => 2^(E4-1023) = 2^+1023 <= The largest possible exponent
Example 5 => 2^(E5-1023) = Infinity or NaN
Когда E встречает 0 , тогда число известно как нормализованное число, представленное как:
Number = (-1)^sign * 2^(E-1023) * (1.F)
, но если E равно 0, то число, известное как денормализованное число, представленное как:
Number = (-1)^sign * 2^(E-1022) * (0.F)
Теперь F - это, в основном, то, что определяется дробными битами:
// Sum over i = 12, 13, ..... , 63
F = sum(Bit(i) * 2^(-i))
и Бит (i) относится к i-му биту числа. Примеры:
Bit representation of the fraction:
Bit no: | 12 | 13 | 14 | 15 | ... ... ... ... | 62 | 63 |
Example 1: | 0 | 0 | 0 | 0 | 0 ... .... 0 | 0 | 1 |
Example 2: | 1 | 0 | 0 | 0 | 0 ... .... 0 | 0 | 0 |
Example 3: | 1 | 1 | 1 | 1 | 1 ... .... 1 | 1 | 1 |
F value assuming 0 < E < 2047:
Example 1 => 1.F1 = 1 + 2^-52
Example 2 => 1.F2 = 1 + 2^-1
Example 3 => 1.F3 = 1 + 1 - 2^-52
Но когда я набираю realmax ('double'), я получаю действительно большое число 1.7977e + 308. Как это число может быть сохранено только в 64 бита?
realmax('double')
двоичное представление
| sign | exponent(E) (11 bit) | fraction (52 bit) |
0 11111111110 1111111111111111111111111111111111111111111111111111
Это
+2^1023 x (1 + (1-2^-52)) = 1.79769313486232e+308
Я взял некоторые определения и примеры с этой страницы Википедии .