Я пишу код C++/C, использующий тип float для выполнения сумм. Я знаю, что могу использовать двойной или длинный двойной, но сейчас я тестирую float. Я сравниваю 2 реализации, одну единственную резьбу, где вся сумма выполняется за один раз, а другая потоковая реализация, где производятся частичные суммы, а затем суммируются в конце, когда все потоки выполняются. Я получаю разницу порядка 0,0001 даже с очень маленькими сериями тестов (скажем, всего 20 номеров, просто чтобы проверить). Это меня удивляет. Понятно, чтобы получить различия, но я ожидал, что они будут меньше. Можно было бы заподозрить ошибку, однако 2 реализации дают согласованные результаты до 3 десятичных знаков. Как вы думаете, это разумно, или я должен искать ошибку? Какая реализация более точна?Прецизионность при расщеплении суммы в частичных суммах в приложениях с резьбой
ответ
Суммарное значение для чисел с плавающей точкой зависит от порядка суммирования. Вероятно, вы столкнулись с этой проблемой.
Можно обеспечить лучшую точность (уменьшить числовые ошибки), если процесс суммирования начинается с меньших значений величины. существуют
Более продвинутые подходы - Kahan summation и т.д.
Спасибо, очень интересно, я не знал (стыдно ...). Я предполагаю, что это трудно достичь в конечном итоге, поскольку это заставило бы меня всегда переупорядочивать данные, но это, безусловно, стоит иметь в виду. Еще раз спасибо. –
@ tony_s_99 Суммирование Kahan не требует переупорядочения – MBo
Я понимаю, что вы хотели бы использовать поплавок для тестирования. Но чтобы подтвердить, что у вас есть ошибка или нет, я просто изменил бы ваши переменные, чтобы удвоить это, попробуй и проверив результат. Если результат для double в порядке, значит, у вас нет ошибки. Если результат для double также сильно отличается, у вас есть ошибка.
Затем после проведения теста вы можете вернуться к плаванию.
Кстати, я думаю, что можно получить такую разницу даже с 20 номерами.
Спасибо, я просто попробую. –
- 1. Прецизионность в numpy: проблемы при сравнении чисел
- 2. Прецизионность поплавков с printf
- 3. Получение проблем при расщеплении строки в PHP
- 4. Прецизионность при чтении изображения с помощью CLK_FILTER_LINEAR в OpenCL
- 5. Абстрактная ошибка при расщеплении строки
- 6. Прецизионность двойных значений в Spark
- 7. OpenCV - ошибка при расщеплении каналов
- 8. проблема с повторным выпуском при расщеплении строки
- 9. Проблема с Spark-Sql при расщеплении данных
- 10. Исключение в расщеплении
- 11. коэффициент в суммах тригонометрических вычислений в Mathematica
- 12. Проблемы с резьбой в WPF
- 13. Прецизионность при делении большими целыми числами
- 14. Прецизионность glReadPixels при чтении unsigned int
- 15. Прецизионность при преобразовании десятичного числа строки
- 16. Бит-переключение в интернет-контрольных суммах
- 17. Как подождать при обратном вызове с резьбой?
- 18. Проблема с некоторыми символами в расщеплении строк
- 19. , который делит для использования при расщеплении строки
- 20. Повторяя заголовок таблицы при расщеплении по столбцу
- 21. Функция cSplit - сохраняет пустые значения при расщеплении
- 22. Переход с резьбой закручиванием
- 23. INotifyPropertyChanged с резьбой
- 24. 0MQ с зеленой резьбой?
- 25. Вилка с сердечником с резьбой
- 26. Проблема с резьбой
- 27. Java-рисунок с резьбой
- 28. Частичных суммам значений словаря в
- 29. Прецизионность реалов через writeln/readln в Delphi
- 30. ошибки при расщеплении реализации и заголовок
Сложно сказать, не увидев ваш исходный код. – duDE
Трудно сказать, не зная величины суммируемых сумм и суммы; если все цифры указаны в тысячах, то разница в 0,0001 - лучшее, на что вы можете надеяться. – dmuir
Порядковый порядок составляет 0,1, ни одно из чисел не больше, чем около 0,9 –