Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
1

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

21.05.2013, 17:21. Показов 3136. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Салют!
Ситуация следующая - есть необходимость работать с изображением, а точнее - с его градиентом/направлением градиента. Для вспомогательных целей использую матрицы double'ов. Этот самый градиент не один раз для изображения пересчитывается, в частности, основная часть - с использованием оп. Собеля, не в этом суть. так вот, до этого работал на VS 2010, и никаких проблем не замечал (может, был слишком незначительны). Недавно переписал весь функционал с нуля, используя VS 2012, и заметил одну вещь - видимо, из-за потери точности(ошибок округления и т.п.) результат после нескольких применений нужных операций не всегда идентичен...Ярко это проявляется на нескольких изображения, и, что самое главное - в и без того проблемных участках.
Возможно ли, что это происходит из-за
ошибок округления и т.п.
т.к. с этими double'ами для каждого пикселя зачастую проводится довольно много операций? И что можно предпринять, чтобы избежать этого? Если буду использовать int'ы (теоретически), такой ситуации возникнуть не должно?

Спасибо за внимание.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2013, 17:21
Ответы с готовыми решениями:

Потеря точности числа формата double
Вечер добрый, товарищи. Вопрос следующий: как можно избежать потери точности при перемножении...

Потеря точности при масштабировании
Доброго времени суток может кто-то подскажет алгоритм масштабирования без потери точности,пока я...

Потеря точности при использовании static_cast
По условию задачи нужно было явное приведение к типу. float n=45.5; int...

Точности вычислений double
Вот у меня возникла проблема при подсчете ряда тейлора в заданном интервале. Проблема заключается...

12
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.05.2013, 17:43 2
Скорее всего допустил ошибку когда переписывал. Проблем с double быть не должно. int вряд ли даст ожидаемый результат.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
21.05.2013, 17:59  [ТС] 3
Но алгоритм то одинаковый (для градиента который)...
Я даже специально среднее арифметическое проверял - разное оно иногда, т.е. все-таки где-то ошибка округления происходит..
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.05.2013, 18:01 4
Ну тогда без кода тут не о чем говорить..
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.05.2013, 18:07 5
monolit, что такое в алгоритме под 2010 не устраивало, что пришлось переписать под 2012? И какая вообще разница 2010/2012 в данном случае? Если есть подозрение на проблемы в 2012, то просто перенесите код в 2010 и проверьте работоспособность.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
21.05.2013, 18:08  [ТС] 6
шибко кода много уж...
Просто я вот думаю - может ли причиной различных результатов быть использование double, или нет? Замечу, что в предыдущей реализации использования этого типа было, вроде, поменьше..

Tulosba, просто студия новая подвернулась, да и быстродействие старого кода оставляло желать лучшего, а пытаться его исправить...несколько тысяч строк, я решил, что проще переписать заново, учитывая мои новые требования...Не все переписывал, конечно, лишь, так сказать, основную часть, в которой и была проблема.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.05.2013, 18:26 7
monolit, т.к. много переписывалось - вероятнее всего просто где-то закралась ошибка. Т.е. алгоритмы не эквивалентны.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
21.05.2013, 18:44  [ТС] 8
Вполне допускаю это. Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же, но вычисленным в другой раз..rand я там не использовал, так что больше грешить не на что) Хитрых условных переходов тоже не припомню. Как бы не пришлось весь код пересматривать, епт..
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.05.2013, 18:46 9
Я не ослышался, алгоритм градиента в несколько тысяч строк??
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.05.2013, 18:48 10
Цитата Сообщение от monolit Посмотреть сообщение
Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же,
Т.е. при одинаковых исходных данных - разный результат? Если да, то это похоже на чтение неинициализированной памяти.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
21.05.2013, 18:51  [ТС] 11
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не ослышался, алгоритм градиента в несколько тысяч строк??
ну, вычисление градиента - лишь малая, вспомогательная, часть, в которой с double и работаю)

А теоретически:
Код
2.0/159
и
Код
2.0/159.0
могли давать разный результат?)
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.05.2013, 18:52 12
Цитата Сообщение от monolit Посмотреть сообщение
могли давать разный результат?)
Нет.

Добавлено через 26 секунд
Может тебе выделить нерабочий кусок и показать?
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
21.05.2013, 21:27  [ТС] 13
Кажись участок с ошибкой нашел. Странно правда...
Позже поподробнее рассмотрю и напишу)

Добавлено через 2 часа 29 минут
Спасибо всем за содействие, действительно, гулял по памяти в самом неожиданно месте...Думал, настолько очевидной ошибки не совершу, а оно вон как...
0
21.05.2013, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2013, 21:27
Помогаю со студенческими работами здесь

float и double (расчет точности)
Всем привет, а есть какой-нибудь алгоритм по расчету точности типов float и double а то...

Точности вычислений и преобразований double
Всем привет! Вопрос точности вычислений и преобразований double. Объясните пожалуйста...

Расчет точности для float и double
По какой формуле рассчитывается точность float и double в количестве знаков после запятой...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std;...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru