В настоящее время я читаю «Конец ошибки - Unum Computing» Джона Густафсона ( Youtube ). Что я до сих пор не уверен, так это то, как дела, обработанные в IEEE с отрицательным знаком нуля , обрабатываются с помощью unums.
Таким образом, прежде всего, unums позволяют представлять определенные точные значения (аналогично плавающим точкам) и дополнительно позволяют представлять открытые интервалы, которые лежат между точными значениями (включая точные -∞ и ∞). Таким образом, полная строка действительных чисел представлена чередующимися точными значениями и открытыми интервалами:
-∞, (-∞, -maxreal), -maxreal, ... -smallsubnormal, (-smallsubnormal, 0),
0,
(0, smallsubnormal), smallsubnormal, ... maxreal, (maxreal, ∞), ∞
Таким образом (в традиции IEEE) исключительные значения, такие как переполнение и переполнение, являются лишь некоторыми открытыми интервалами. Другими словами: эти ранее особые условия теперь превращаются в обычные случаи.
IEEE -∞ соответствует объединению {-∞} и (-∞, -maxreal).
И ноль со знаком теперь может быть интервалами (-smallsubnormal, 0) и (0, smallsubnormal).
Однако 1 / (- smallsubnormal, 0) теперь (-∞, -maxreal) и не -∞ в одиночку. Тогда как 1/0 - это ∞.
Что я до сих пор сомневаюсь, так это то, что в IEEE -0 и +0 сравниваются одинаково. Но они не в униумах. Кажется, что картирование не на 100%. Поэтому мне интересно, есть ли угловые случаи, где разница может проявиться ((и действительно ли эти случаи актуальны)).
(Я в курсе , почему отрицательный нуль важно? , Использование для отрицательного значения с плавающей точкой )
источник
guess
) говорит о том, что можно более или менее (и для начала) переводить вещи буквально. Я полностью осознаю, что буквальный перевод не в полной мере использует преимущества unums.Ответы:
Слишком долго для комментария, поэтому пишу это как ответ ...
Проблема с IEEE состоит в том, что у нас есть три случая для дифференциации, но только два представления для них:
(-smallsubnormal,0)
0
(0, +smallsubnormal)
.Проблема сейчас не в отрицательном нуле, а в том, что мы не можем различить, если IEEE 0.0 - это второй или третий случай! Другими словами: функция отображения из UNUM в IEEE не является биективной - и никогда не будет, как и для любого другого значения IEEE, мы никогда не узнаем, является ли оно точным или интервальным!
Так что я думаю, что абсолютно нормально отображать -0.0 в
(-smallsubnormal,0)
, и нам нужно решить, является ли IEEE 0.0 скорее сопоставленным0
или, возможно, лучше(0, +smallsubnormal)
. Я лично склоняюсь к первому, но это не очень авторитетно ...Что касается сравнения с IEEE (-0.0 равно 0.0): в любом случае (почти) никогда не следует сравнивать точное равенство (оператор C или C ++: ==), но только для абсолютного значения разности, которое меньше некоторого соответствующего порога. Эта проблема устранена только частично даже с помощью UNUMS, поскольку теперь мы можем сравнивать точное равенство, если бит u не установлен, но с его установкой мы все еще не знаем ...
источник