Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
monolit
187 / 186 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
#1

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

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

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

Спасибо за внимание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2013, 17:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потеря точности у double (C++):

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

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

Потеря точности при использовании static_cast - C++
По условию задачи нужно было явное приведение к типу. float n=45.5; int temp=static_cast<int>(n); ...

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

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

Точности вычислений и преобразований double - C++
Всем привет! Вопрос точности вычислений и преобразований double. Объясните пожалуйста следующее: Арифметические операции: ...

12
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 17:43 #2
Скорее всего допустил ошибку когда переписывал. Проблем с double быть не должно. int вряд ли даст ожидаемый результат.
0
monolit
187 / 186 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
21.05.2013, 17:59  [ТС] #3
Но алгоритм то одинаковый (для градиента который)...
Я даже специально среднее арифметическое проверял - разное оно иногда, т.е. все-таки где-то ошибка округления происходит..
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 18:01 #4
Ну тогда без кода тут не о чем говорить..
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.05.2013, 18:07 #5
monolit, что такое в алгоритме под 2010 не устраивало, что пришлось переписать под 2012? И какая вообще разница 2010/2012 в данном случае? Если есть подозрение на проблемы в 2012, то просто перенесите код в 2010 и проверьте работоспособность.
0
monolit
187 / 186 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
21.05.2013, 18:08  [ТС] #6
шибко кода много уж...
Просто я вот думаю - может ли причиной различных результатов быть использование double, или нет? Замечу, что в предыдущей реализации использования этого типа было, вроде, поменьше..

Tulosba, просто студия новая подвернулась, да и быстродействие старого кода оставляло желать лучшего, а пытаться его исправить...несколько тысяч строк, я решил, что проще переписать заново, учитывая мои новые требования...Не все переписывал, конечно, лишь, так сказать, основную часть, в которой и была проблема.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.05.2013, 18:26 #7
monolit, т.к. много переписывалось - вероятнее всего просто где-то закралась ошибка. Т.е. алгоритмы не эквивалентны.
0
monolit
187 / 186 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
21.05.2013, 18:44  [ТС] #8
Вполне допускаю это. Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же, но вычисленным в другой раз..rand я там не использовал, так что больше грешить не на что) Хитрых условных переходов тоже не припомню. Как бы не пришлось весь код пересматривать, епт..
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
21.05.2013, 18:46 #9
Я не ослышался, алгоритм градиента в несколько тысяч строк??
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.05.2013, 18:48 #10
Цитата Сообщение от monolit Посмотреть сообщение
Но результат различается не в сравнении со старым алгоритмом, а в сравнении с собой же,
Т.е. при одинаковых исходных данных - разный результат? Если да, то это похоже на чтение неинициализированной памяти.
0
monolit
187 / 186 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
21.05.2013, 18:51  [ТС] #11
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не ослышался, алгоритм градиента в несколько тысяч строк??
ну, вычисление градиента - лишь малая, вспомогательная, часть, в которой с double и работаю)

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

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

Добавлено через 2 часа 29 минут
Спасибо всем за содействие, действительно, гулял по памяти в самом неожиданно месте...Думал, настолько очевидной ошибки не совершу, а оно вон как...
0
21.05.2013, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 21:27
Привет! Вот еще темы с ответами:

Расчет точности для float и double - C++
По какой формуле рассчитывается точность float и double в количестве знаков после запятой отностительно целой части? Чтобы вопрос был более...

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

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include <iostream> #include <cmath> using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Warning C4244: return: преобразование "double" в "float", возможна потеря данных - C++
помогите разобраться. пишу программу в функции выдает ошибку в строке с return "warning C4244: return: преобразование "double" в "float",...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.