Разница в значениях при конвертации из double (float64) в float (float32) в numpy - PullRequest
1 голос
/ 30 апреля 2020

Когда я запускаю простой код:

a = np.float64([20269207])
b = np.float32(a)

Выход становится

a = array([20269207.])
b = array([20269208.], dtype=float32)

Какая причина вызывает разницу до и после этого преобразования? А в каких условиях выходы будут разные?

1 Ответ

1 голос
/ 30 апреля 2020

Невозможно сохранить значение 20269207 в формате float32 ( IEEE 754 ).

Вы можете видеть, почему:

Это можно хранить значения 20269206 и 20269208; их представления в двоичной форме (см. IEEE-754 с плавающей запятой ):

  • 01001011100110101010010001001011 для 20269206
  • 01001011100110101010010001001100 для 20269208

Их двоичные формы отличаются на 1, поэтому нет места для любого числа между 20269206 и 20269208.

По правила округления «Округление до ближайшего, привязка к четному» и «Округление до ближайшего, привязка от нуля» из IEEE 754 , ваше число округляется до ближайшее еще большее число, т. е. к числу 20269208.


Выводы для целых чисел будут отличаться:

  • для нечетных чисел с абсолютными значение больше 16,777,216,
  • для почти для всех чисел с абсолютным значением, превышающим 33,554,432.

Примечания:

  1. Первое число - 2^24, второе - 2^25.
  2. «allmost all» - есть «хорошие» числа, такие как степени 2, которые имеют точное представление даже f или очень очень большие числа .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...