Оптимизировать набор данных для операций с плавающей запятой add / sub / mul / div - PullRequest
0 голосов
/ 24 мая 2018

Предположим, у нас есть набор данных чисел, с помощью которого мы хотим выполнить некоторые вычисления, используя сложение / вычитание / умножение / деление с использованием компьютера.

Охват действительных чисел представлением с плавающей запятой варьируетсямного, в зависимости от представляемого числа:

С точки зрения абсолютной точности в отображении real-> FP «дыры» растут в сторону больших чисел со странной дырой около 0, в зависимости от архитектуры.Из-за этого точность добавления / смещения к большим числам снизится.

Если мы разделим 2 последовательных числа, которые представлены в нашем представлении с плавающей запятой, результат деления будет больше как при переходе кбольшие числа и при переходе к меньшим и меньшим дробям.

Итак, мой вопрос:

Есть ли "сладкий интервал" для поплавков на обычном ПК сегодня,где результаты арифметики с указанными операторами (add / sub / mul / div) просто более точны?

Если у меня есть набор данных из многозначных чисел, таких как "123123123123123", "134534513412351151" и т. д., с помощью которых я хочу выполнить некоторую арифметику, в какой интервал с плавающей запятой его следует преобразовать, чтобы получить наилучшую точность для результата?

  • Так как с плавающей запятой это что-то вроде 1.xxx*10^yyy, 2.xxx*10^yyy, ..., 9.xxx*10^yyy, я бы предположил, что преобразование моих чисел в интервал [1, 9] дало бы наилучшие результаты для используемой памяти, но я могу быть ужасно ошибочнымg ...

Предположим, я использую C, можно ли такое преобразование сделать?Есть ли лучшая практика для этого?Перед операцией C преобразует операнды в тот же формат, поэтому, я думаю, мне нужно использовать строковое представление, вставив «.»где-то и разобрать это как float.

Обратите внимание:

Это теоретический вопрос, у меня нет фактического набора данных на моей руке, который бы решал, чтолучший.На той же ноте упоминание о С было случайным, меня также интересуют ответы типа «забудь С, я бы использовал это и это, ПОТОМУ ЧТО оно поддерживает это и это».

Пожалуйста, избавь меня от таких ответов, как«на это нельзя ответить, потому что это зависит от реальных операций, поскольку результаты могут быть в другом диапазоне величин, чем исходные данные и т. д. и т. д.».Предположим, что результаты вычисления находятся более или менее в том же интервале, что и операнды.Конечно, при делении операндов "более или менее одинаковой величины" результат будет где-то между 1-10, может быть, 0,1-100, ..., но это, вероятно, именно лучший интервал, в котором они могут быть.

Конечно, если ответ включает какое-то объяснение, кроме отмахивания, я буду рад его прочитать!

1 Ответ

0 голосов
/ 24 мая 2018

Абсолютная точность чисел с плавающей точкой изменяется с величиной чисел, потому что показатель степени изменяется.Относительная точность не изменяется, за исключением чисел в нижней части диапазона экспонент, где происходит недостаточное вычисление.Если вы умножите двоичные числа с плавающей запятой на степень два, выполните арифметику (соответствующим образом скорректированную для масштабирования) и поверните масштабирование обратно, результаты будут идентичны выполнению арифметики без масштабирования, за исключением эффектов переполнения и понижения.Если в вашей арифметике есть переполнение или переполнение, масштабирование может помочь избежать этого.Например, если ваша точность страдает из-за того, что ваши числа настолько малы, что некоторые промежуточные результаты ниже нормального диапазона формата с плавающей запятой, то масштабирование на степень два может избежать потери точности из-за недостаточного значения.

Если вы масштабируете чем-то другим, чем степень двойки, результаты могут отличаться из-за изменений в значимостях.Эффекты, как правило, будут крошечными, и будут ли результаты лучше или хуже - случайный шанс, за исключением тщательно продуманных особых ситуаций.

...