Мне было интересно, была ли какая-то работа над альтернативой числам с плавающей запятой, где число просто представлено как экспонента (и бит знака). Это было бы похоже на числа с плавающей запятой, за исключением того, что мантисса будет пропущена, а базовый b
(обычно) не будет равен 2.
Как следствие, единственные представимые числа - это некоторые степени b
.
Вот простой пример:
Пусть b
равен 2 ^ (2 ^ -4), и давайте используем 8 бит для представления. Первый бит используется для знака, остальные 7 - для экспоненты, которая находится в дополнительном двоичном коде. потом
00000000 represents (2^(2^-4))^0 = 1
00000001 represents (2^(2^-4))^1 ≈ 1.044
10000000 represents -1
01000001 represents (2^(2^-4))^-63 ≈ 0.065
10111111 represents -(2^(2^-4))^63 ≈ -15.32
Обратите внимание, что могут быть добавлены особые случаи для 0, NaN и т. д.
Представление имеет определенные преимущества перед обычным представлением с плавающей запятой. Например, умножение становится сложением, и представимые числа распределяются более плавно. Одним из недостатков может быть добавление вычислений (реализация, которую я придумал, использует двоичное дерево, которое может быть быстрым, если дерево маленькое и реализовано аппаратно).
Приветствуется любая информация, связанная с этим представлением (было ли оно рассмотрено, почему оно было бы плохим, его название, если оно есть, и т. д.).
@JohnColeman Это похоже на поплавки. Они могут представлять только конечное число реалов. Тем не менее, они полезны для вычислений. Обратите внимание, что точность можно настроить с помощью b
; b
, близкий к 1, увеличивает его, но уменьшает выражаемый диапазон. Это представление так же эффективно, как и обычные числа с плавающей запятой, в том смысле, что с тем же количеством битов можно представить аналогичный диапазон с аналогичной точностью (путем выбора b
соответствующим образом).
Технически это может быть по крайней мере частично не по теме для переполнения стека, поскольку он запрашивает внешние ресурсы. Но это небезынтересно. Но я думаю, было бы интереснее, если бы вы показали конкретные варианты использования. Я не знаю о работе в этом направлении.
Зависит ли сложение в определенных пределах только от разности показателей? Рассмотрим b ^ x + b ^ y = (b ^ 0 + b ^ (y-x)) • b ^ x, поэтому знание 1 + b ^ z для всех z упрощает вычисление b ^ x + b ^ y. (Это положительно для обоих элементов; аналогичный результат сохраняется для всех комбинаций знаков.)
@EricPostpischil Спасибо, что указали на это. Я удалил ссылку на ссылки. Надеюсь, мой вопрос не будет приостановлен! Насколько я понимаю, варианты использования похожи на поплавки. Если бы они могли быть реализованы эффективно, что, как я думаю, имеет больше шансов произойти для небольшого количества битов, то плавное распределение и его простота могли бы дать ему преимущество перед традиционными числами с плавающей запятой.
@EricPostpischil Да, знание log (1 + b ^ z) для всех z позволяет легко вычислить b ^ x + b ^ y.
@JohnColeman: Обычные числа с плавающей запятой аналогичным образом представляют числа более плотно около нуля. Этот формат может иметь такую же среднюю плотность между выбранными конечными точками, что и обычные числа с плавающей запятой, но он будет чисто регулярным (и геометрическим), тогда как линейные числа с плавающей запятой имеют неоднородности при скачках экспоненты.
Это логарифмическая система счисления: «LNS можно рассматривать как число с плавающей запятой с мантиссой, всегда равной 1».
LNS в основном может быть реализован через ALU, который может совместно использоваться.
Как это может быть полезно, если вам нужно число, не являющееся целой степенью
b
? Я не понимаю, как такая система может набрать большую популярность. Это не общая схема представления действительных чисел.