vak: (Default)
[personal profile] vak
Соорудил список всех "интересных" чисел с плавающей точкой (32-битных). Вдруг кому пригодится.

floats.txt

Некоторые выдающиеся экземпляры:
Знак
| Экспонента      Мантисса
0 00000000 00000000000000000000000 = 0.0
1 00000000 00000000000000000000000 = -0.0
0 00000000 00000000000000000000001 = 1.40129846e-45 денормализованное
0 00000000 10000000000000000000000 = 5.87747175e-39 денормализованное
0 00000000 11111111111111111111111 = 1.17549421e-38 денормализованное
0 00000001 00000000000000000000000 = 1.17549435e-38
0 01111111 00000000000000000000000 = 1.0
0 01111111 00000000000000000000001 = 1.00000012
0 01111111 10000000000000000000000 = 1.5
0 01111111 11111111111111111111111 = 1.99999988
0 10000000 00000000000000000000000 = 2.0
0 10000000 00000000000000000000001 = 2.00000024
0 10000000 10000000000000000000000 = 3.0
0 10000000 11111111111111111111111 = 3.99999976
0 11111110 00000000000000000000000 = 1.70141183e+38
0 11111110 11111111111111111111111 = 3.40282347e+38
0 11111111 00000000000000000000000 = inf
1 11111111 00000000000000000000000 = -inf
0 11111111 00000000000000000000001 = nan
0 11111111 10000000000000000000000 = nan
0 11111111 11111111111111111111111 = nan

Date: 2022-08-04 00:12 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Интересные ещё и те, которые при преобразовании в десятичные (или из них) округляются всяко разно (вниз, вверх, к чётному, с изменением порядка, с вырождением в 0 или бесконечность, (почти) влазят в целое из 8n бит).

Date: 2022-08-04 01:35 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Что это за странное представление. Старший бит подразумевается, что ли?

Date: 2022-08-04 01:49 (UTC)
From: [personal profile] dijifi
И как f(f(x))=-x будет выглядеть для IEEE flat?

Date: 2022-08-04 03:53 (UTC)
From: [personal profile] dijifi
Краёв не видно, а там самое интересное.

Хотя один край видно и там работать не будет: (1,2] отображается в (0,-1] а теперь прикиньте сколько индивидуальных значений IEEE float находятся в этих диапазонах.
Edited Date: 2022-08-04 03:57 (UTC)

Date: 2022-08-05 03:36 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Правильным решением будет делать цикл длиной 4 из младшего бита мантиссы и бита знака, благо есть разница между +0 и -0, и есть понятие ненормализованных чисел.

Date: 2022-08-04 02:05 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Да, в мантиссе, покуда не выскочишь в денормализованный диапазон.

Date: 2022-08-04 03:58 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Так в IEEE формате отродясь так.

It can be required that the most significant digit of the significand of a non-zero number be non-zero (except when the corresponding exponent would be smaller than the minimum one). This process is called normalization. For binary formats (which uses only the digits 0 and 1), this non-zero digit is necessarily 1. Therefore, it does not need to be represented in memory; allowing the format to have one more bit of precision. This rule is variously called the leading bit convention, the implicit bit convention, the hidden bit convention, or the assumed bit convention.

https://en.wikipedia.org/wiki/Floating-point_arithmetic#Hidden_bit

Date: 2022-08-04 03:48 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Очень удобное представление для 16-битных компьютеров.
Для сравнения 2-х чисел на больше/меньше почти всегда достаточно первых 16-бит

только отрицательный ноль раздражает. проверка на него - дополнительная операция

Еще интересное число: 0.1
Для начинающего программиста обычно открытие - его неточное представление:
0 01111011 10011001100110011001101
Edited Date: 2022-08-04 04:25 (UTC)

Date: 2022-08-04 04:44 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Погулял тут по ссылкам в википедии и примерно понял, для чего, возможно, была команда ВЧАБ.

Алгоритм по ссылке был опубликован в 1974 году, но советская секретная математика, возможно, тоже была не промах. Впрочем, аналогичная команда была и в IBM NORC, так что и американская секретная морская артиллерийская математика, возможно, была не промах ещё раньше, пардон за каламбур.

Date: 2022-08-05 03:38 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Причём не простая бабушка, а чешская. Собственно, по здравом размышлении, ничего особо секретного в этой математике нет: команда ВЧАБ нужна просто для сортировки чисел по абсолютной величине, а уж этому найдётся много применений.

Date: 2022-08-05 03:58 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Кстати говоря, получается круто. Если тупо складывать числа 1/1001, 2/1001, ... , 1000/1001 в произвольном порядке, то очень быстро текущий порядок суммы начнёт сильно отличаться от порядка очередного слагаемого, и ошибка будет накапливаться. А вот что получается с помощью алгоритма:
F O R E X   ИПM AH CCCP           BEPCИЯ  2.02 OT  15.07.80

                 1       PROGRAM MAIN                                                                  1
                 2       S = 0.                                                                        2
                 3       SS = 0.                                                                       3
                 4       C = 0.                                                                        4
                 5       DO 10 I = 1,1000                                                              5
                 6       D = MOD(I*137, 1001)/1001.0                                                   6
                 7       SS = SS + D                                                                   7
                 8       T = S + D                                                                     8
                 9       C = (S - T) + D + C                                                           9
                10       S = T                                                                        10
                11    10 CONTINUE                                                                     11
                12       S = S + C                                                                    12
                13       PRINT 1, S, SS                                                               13
                14    1  FORMAT(1XF20.15)                                                             14
                15       END                                                                          15

           *EXECUTE
  500.000000000000000
  499.999999848194420


Несмотря на известную несимметричность округления при делении, её оказалось недостаточно, чтобы испортить правильно подсчитанную сумму даже в последнем знаке. А тупое сложение успело потерять бит 17-18 точности.

Date: 2022-08-05 06:41 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Это не совсем то - это вычитание unsigned из unsigned (зачем в этом случае говорить two's complement - неясно).

Date: 2022-08-06 01:37 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Ну так быстро сортировать числа по абсолютной величине всем хотелось. Наверное, для этого есть много численно-методических резонов.