2016-11-02 1 views
0

Я пишу код C++/C, использующий тип float для выполнения сумм. Я знаю, что могу использовать двойной или длинный двойной, но сейчас я тестирую float. Я сравниваю 2 реализации, одну единственную резьбу, где вся сумма выполняется за один раз, а другая потоковая реализация, где производятся частичные суммы, а затем суммируются в конце, когда все потоки выполняются. Я получаю разницу порядка 0,0001 даже с очень маленькими сериями тестов (скажем, всего 20 номеров, просто чтобы проверить). Это меня удивляет. Понятно, чтобы получить различия, но я ожидал, что они будут меньше. Можно было бы заподозрить ошибку, однако 2 реализации дают согласованные результаты до 3 десятичных знаков. Как вы думаете, это разумно, или я должен искать ошибку? Какая реализация более точна?Прецизионность при расщеплении суммы в частичных суммах в приложениях с резьбой

+1

Сложно сказать, не увидев ваш исходный код. – duDE

+0

Трудно сказать, не зная величины суммируемых сумм и суммы; если все цифры указаны в тысячах, то разница в 0,0001 - лучшее, на что вы можете надеяться. – dmuir

+0

Порядковый порядок составляет 0,1, ни одно из чисел не больше, чем около 0,9 –

ответ

2

Суммарное значение для чисел с плавающей точкой зависит от порядка суммирования. Вероятно, вы столкнулись с этой проблемой.

Можно обеспечить лучшую точность (уменьшить числовые ошибки), если процесс суммирования начинается с меньших значений величины. существуют

Более продвинутые подходы - Kahan summation и т.д.

+0

Спасибо, очень интересно, я не знал (стыдно ...). Я предполагаю, что это трудно достичь в конечном итоге, поскольку это заставило бы меня всегда переупорядочивать данные, но это, безусловно, стоит иметь в виду. Еще раз спасибо. –

+0

@ tony_s_99 Суммирование Kahan не требует переупорядочения – MBo

0

Я понимаю, что вы хотели бы использовать поплавок для тестирования. Но чтобы подтвердить, что у вас есть ошибка или нет, я просто изменил бы ваши переменные, чтобы удвоить это, попробуй и проверив результат. Если результат для double в порядке, значит, у вас нет ошибки. Если результат для double также сильно отличается, у вас есть ошибка.
Затем после проведения теста вы можете вернуться к плаванию.
Кстати, я думаю, что можно получить такую ​​разницу даже с 20 номерами.

+0

Спасибо, я просто попробую. –

Смежные вопросы