двойная точность в MATLAB - PullRequest
0 голосов
/ 16 июня 2020

Таким образом, двойная точность требует 64 бита в MATLAB. Я знаю, что 0 или 1 займут один бит.

Но когда я набираю realmax ('double'), я получаю действительно большое число 1.7977e + 308. Как можно сохранить это число только в 64 бита?

Буду признателен за любые пояснения. Спасибо.

1 Ответ

3 голосов
/ 17 июня 2020

Это не вопрос 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

Я взял некоторые определения и примеры с этой страницы Википедии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...