Pull to refresh

Comments 17

Вопрос, рассматриваемый в статье, очень интересный и актуальный (сходу вспоминается несколько задач, где необходимо компенсировать погрешности при накоплении). Но проверять выкладки совершенно не хочется после увиденного кода… Сразу с первого примера…

Сначала:

val = val/10000000000.0.0;


Потом:

for (int i = 0; i < 10000000000.0; i++) {

(не могу проверить на разных 64-битных компиляторах — да, возможно, в некоторых случаях int будет занимать 64 бита, но в 32-битной системе значение переменной в int не может превышать 2^31-1, что << 10^10).

Ну, и всякие мелочи, вроде вместо для функции printf.
буквально недавно Бобук искал кандидатов на работу, знающих почему деньги нельзя хранить в числах с плавающей точкой :))
Наверное ветхость, но когда мне нужна была точность при вычислении и округлении, я использовал текстовую обработку.
Можно проводить операции с текстом, а можно (если числа не астрономические) переводить дроби в целые (например 20.3+5.54 = 2030 + 554) и затем в нужное место поставить точку, сие работает отлично для сложения, вычитания и умножения. Деление — тут особый случай… оно не требовалось в системе :)
Мсье знает толк в извращениях.

Есть же библиотеки для Arbitrary Precision Arithmetics. Текстовая обработка — наверняка еще в десятичной системе счисления — это просто надругательство над ресурсами компьютера. Ну а 20.3+5.54=2030+554 — это же арифметика с фиксированной точкой. Она потому редко и применяется в алгоритмах общего назначения, что почти всегда уступает в точности арифметике с плавающей точкой. Реализация некоторых алгоритмов на числах с фиксированной точкой может оказаться эффективнее (по скорости или точности), но это обычно требует больших усилий разработчика.
Если ресурсов много, а вычислений мало, но они есть, то вполне себе работает:)
За отсылку — спасибо!
Ваше решение в целом талантливо, так как вы без теоретической подготовки нашли работающие алгоритмы. Но если к вашему таланту да добавить матчасть — то результаты могли бы получиться значительно лучшие. Арифметика с произвольной точностью описывается во многих книгах, в том числе в классике — Дональд Кнут.
А есть подобные операции для деления и логарифма? В pdf который приведен в ссылках к статье я его не нашел.
Это делалось, скорее всего, для геометрических алгоритмов. Во всех геометрических предикатах можно обойтись только умножением и сложением. Сложные функции, вроде log, скорее всего сами дают неплохую погрешность (там вроде аппроксимация Тейлором или что-то похожее). Зачем нужно деление я не знаю.
Не проводили сравнение скорости между вот этими вычислениями с компенсацией и BD/BCD числами аналогичной размерности?
Нет, не проводил. В моей задаче был разговор именно про компенсации.
Автор открыл для себя double-double только зачем-то называет это погрешностью и вычисляет половинки отдельно
crd-legacy.lbl.gov/~dhbailey/mpdist QD library
Ну нельзя сказать, что их открыл я. Моя работа была основана на работе Шевчука, которая вышла в 1997 году. Я не спорю, что это достаточно старая информация, но было показано, что она работает.
Кажется, имелось в ввиду, что «вычисление погрешности» эквивалентно расширению типа данных до 128 бит. И есть готовые решения.
Господа, небольшой спойлер: я сейчас работаю над второй частью, где покажу на примере задачи связанной с интегрированием, как одни (переменные + погрешности) зависят от других.
У процессоров (по крайней мере, у x86 и x64) можно настраивать режим округления при операциях с плавающей запятой. Если, например, сложить 2 числа в режиме округления вниз, а потом в режиме округления вверх, то мы получим интервал, в котором точно находится результат. Дальше мы уже можем выполнять операции над такими интервалами. В общем случае это несколько сложнее, чем операции над концами интервалов, как в случае [1;2] / [-1;1], но легко реализуемо.

Но это актуально только, если у нас изначально точные данные. А на практике у нас обычно данные неточных приборов, когда известно мат. ожидание и дисперсия. С ними диапазоны малополезны.
Sign up to leave a comment.

Articles

Change theme settings