Как правильно рассчитать скользящее среднее больших наборов чисел с 32-битной плавающей точкой? - PullRequest
4 голосов
/ 09 сентября 2011

Я пишу трассировщик пути, и мне приходится собирать среднее по большому количеству выборок на пиксель.Я получаю значительные визуальные различия между прогоном 1024 выборок и прогоном 16384 выборок;пробег 16384 образцов темнее.Я предполагаю, что это потому, что изображение с 16384 образцами сталкивается с ошибками точности с плавающей точкой.Я усредняю ​​значения цвета путем деления каждого значения на 16384, а затем сложения их вместе.

Есть ли способ усреднить большой, сложный для вычисления набор чисел с известной величиной при минимизации ошибки округления?Желательно, не требуя непостоянной памяти, и определенно, не выбрасывая никаких образцов?

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

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

1 голос
/ 11 сентября 2011

Поскольку вы делите на степень 2 и ваши числа не являются сверхмалыми, этот шаг не должен влиять на точность результата. Вы просто вычитаете 14 из показателя степени.

Подсчитано количество бит в ваших выборках.

Поплавки дают вам 24 бита точности. Если у вас есть 2 ^ 14 = 16384 семплов, то, когда вы сложите их все, вы будете постепенно терять точность до тех пор, пока в какой-то момент ничего не произойдет после потери 24-14 = 10-го бита. Другими словами: на данный момент вы сохраняете только около 3 десятичных цифр.

Можно ли использовать int в качестве аккумулятора или даже uint? Таким образом, вы сохраните 8 дополнительных битов, в два раза больше, чем разница между 1024 и 16384 сэмплами.

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

То, сколько вы получите этим методом, зависит от того, насколько хороша ваша первоначальная аппроксимация среднего и насколько близки значения к среднему. Так что я бы сказал, что, вероятно, он менее надежен в вашей ситуации.

...