Форум программистов, компьютерный форум CyberForum.ru

Потеря точности у double - C++

Восстановить пароль Регистрация
 
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 17:21     Потеря точности у double #1
Салют!
Ситуация следующая - есть необходимость работать с изображением, а точнее - с его градиентом/направлением градиента. Для вспомогательных целей использую матрицы double'ов. Этот самый градиент не один раз для изображения пересчитывается, в частности, основная часть - с использованием оп. Собеля, не в этом суть. так вот, до этого работал на VS 2010, и никаких проблем не замечал (может, был слишком незначительны). Недавно переписал весь функционал с нуля, используя VS 2012, и заметил одну вещь - видимо, из-за потери точности(ошибок округления и т.п.) результат после нескольких применений нужных операций не всегда идентичен...Ярко это проявляется на нескольких изображения, и, что самое главное - в и без того проблемных участках.
Возможно ли, что это происходит из-за
ошибок округления и т.п.
т.к. с этими double'ами для каждого пикселя зачастую проводится довольно много операций? И что можно предпринять, чтобы избежать этого? Если буду использовать int'ы (теоретически), такой ситуации возникнуть не должно?

Спасибо за внимание.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 17:43     Потеря точности у double #2
Скорее всего допустил ошибку когда переписывал. Проблем с double быть не должно. int вряд ли даст ожидаемый результат.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 17:59  [ТС]     Потеря точности у double #3
Но алгоритм то одинаковый (для градиента который)...
Я даже специально среднее арифметическое проверял - разное оно иногда, т.е. все-таки где-то ошибка округления происходит..
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 18:01     Потеря точности у double #4
Ну тогда без кода тут не о чем говорить..
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.05.2013, 18:07     Потеря точности у double #5
monolit, что такое в алгоритме под 2010 не устраивало, что пришлось переписать под 2012? И какая вообще разница 2010/2012 в данном случае? Если есть подозрение на проблемы в 2012, то просто перенесите код в 2010 и проверьте работоспособность.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 18:08  [ТС]     Потеря точности у double #6
шибко кода много уж...
Просто я вот думаю - может ли причиной различных результатов быть использование double, или нет? Замечу, что в предыдущей реализации использования этого типа было, вроде, поменьше..

Tulosba, просто студия новая подвернулась, да и быстродействие старого кода оставляло желать лучшего, а пытаться его исправить...несколько тысяч строк, я решил, что проще переписать заново, учитывая мои новые требования...Не все переписывал, конечно, лишь, так сказать, основную часть, в которой и была проблема.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.05.2013, 18:26     Потеря точности у double #7
monolit, т.к. много переписывалось - вероятнее всего просто где-то закралась ошибка. Т.е. алгоритмы не эквивалентны.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 18:44  [ТС]     Потеря точности у double #8
Вполне допускаю это. Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же, но вычисленным в другой раз..rand я там не использовал, так что больше грешить не на что) Хитрых условных переходов тоже не припомню. Как бы не пришлось весь код пересматривать, епт..
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 18:46     Потеря точности у double #9
Я не ослышался, алгоритм градиента в несколько тысяч строк??
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.05.2013, 18:48     Потеря точности у double #10
Цитата Сообщение от monolit Посмотреть сообщение
Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же,
Т.е. при одинаковых исходных данных - разный результат? Если да, то это похоже на чтение неинициализированной памяти.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 18:51  [ТС]     Потеря точности у double #11
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не ослышался, алгоритм градиента в несколько тысяч строк??
ну, вычисление градиента - лишь малая, вспомогательная, часть, в которой с double и работаю)

А теоретически:
Код
2.0/159
и
Код
2.0/159.0
могли давать разный результат?)
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 18:52     Потеря точности у double #12
Цитата Сообщение от monolit Посмотреть сообщение
могли давать разный результат?)
Нет.

Добавлено через 26 секунд
Может тебе выделить нерабочий кусок и показать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 21:27     Потеря точности у double
Еще ссылки по теме:

warning C4244: =: преобразование "double" в "float", возможна потеря данных C++
Расчет точности для float и double C++
Потеря точности числа формата double C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
21.05.2013, 21:27  [ТС]     Потеря точности у double #13
Кажись участок с ошибкой нашел. Странно правда...
Позже поподробнее рассмотрю и напишу)

Добавлено через 2 часа 29 минут
Спасибо всем за содействие, действительно, гулял по памяти в самом неожиданно месте...Думал, настолько очевидной ошибки не совершу, а оно вон как...
Yandex
Объявления
21.05.2013, 21:27     Потеря точности у double
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru