Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование double вместо float, повысится ли точность вычислений? 
:(
    Опции темы
math64
Дата 3.9.2012, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(Нитонисе @  2.9.2012,  21:18 Найти цитируемый пост)
Это две эквивалентные записи?

В первом случае 1. - число типа double (1.f - число типа float), во втором - (double)1 - целое, приводимое к типу double. Во втором случае приведение производится на этапе компиляции, так что записи эквивлентны.
((double)1/3) и (1/(double)3) - тоже эквиваленты ((double)1/(double)3), так как приведение одного операнда к double заставляет компилятора приводить к double другой операнд. Деление будет тоже призводиться на этапе компиляции - так, что писать лучше (1./3) чем 0,333333333333
В случае ((double)i/3); приведение типа и деление будут выполняться на этапе выполнения; 3 будет заменена на 3, на этапе компиляции.

Цитата(Нитонисе @  2.9.2012,  21:18 Найти цитируемый пост)
Так ведь и если с конца начать складывать, то до некоторого числа сумма будет равняться нулю.

Вычисление призводится с плавающей точкой, а не фиксированной. члены ряда не будут равны 0 очень долго, но будучи прибавлены к накопленной сумме (большей 1), будут сначала терять младшие разряды точности, а затем вовсе не изменять сумму.
Точнее свего алгоритм суммурования такой:
1. слагаемые записываются в вектор
2. вектор сортируется по убыванию абсолютной величины.
3. если в векторе не меньше 2 чисел, два последних складываются и заменяются на сумму ; переход к пункту 2;
Можешь попробовать на тесте (сложение без сортировки float; сложение c сортировкой float; сложение без сортировки double; сложение c сортировкой double) и сравнить результаты. Правда, сортировка будет происходить неоправданно долго.


Цитата(Нитонисе @  2.9.2012,  21:18 Найти цитируемый пост)
 Смысла нет отводить две переменные под верхний и нижний диапазон, потому что они равноудалены от среднего значения.

В том то и дело, что не равноудалены. Поэтому практичнее считать СКО.
(1+-0.1) * (2+-0.1) = (0.9 .. 1.1) * (1.9 .. 2.1) = (1.71 .. 2.31) - середина 2.01, а не 2


PM   Вверх
Нитонисе
Дата 3.9.2012, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Цитата(FCM @  3.9.2012,  07:46 Найти цитируемый пост)
Все же посмотри первую главу Вержбицкого, насчет различных видов ошибок  и методов их оценки

Я посмотрел. Сложный материал для восприятия. Занялся бы более тщательным изучением с целью применения на практике, да вот только смущает, что при вычислении погрешности также допускается погрешность. 

Цитата(math64 @  3.9.2012,  08:08 Найти цитируемый пост)
В первом случае 1. - число типа double
Дело в том, что где-то мне попадалась на глаза фраза, что если тип приведения не указан явно, то компилятор может преобразовать такое число и к double и к float. Так что лучше наверное указывать тип явно, тем более, что преобразование состоится на этапе компиляции, а значит выполнение будет производиться быстрее.

PM MAIL   Вверх
FCM
Дата 3.9.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(Нитонисе @  3.9.2012,  10:26 Найти цитируемый пост)
Занялся бы более тщательным изучением с целью применения на практике, да вот только смущает, что при вычислении погрешности также допускается погрешность. 

Погрешность погрешности будем величиной более малого порядка, но рефлексировать (или рекурсировать) на эту тему слишком глубоко не стоит. У Вержбицкого коротенько и наглядно обсуждаюся статистический и технический подходы к оценке погрешности совокупности большого числа вычислений.


Цитата(math64 @  3.9.2012,  08:08 Найти цитируемый пост)
В случае ((double)i/3); приведение типа и деление будут выполняться на этапе выполнения

Разве приведение будет на этапе выполнения?

Это сообщение отредактировал(а) FCM - 3.9.2012, 10:39
PM MAIL   Вверх
Нитонисе
Дата 3.9.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Немного оффтопный вопрос. Я раньше работал с float и не было проблем перевода float в строку и обратно (FloatToStr и StrToFloat). А что с double? Готовых функций нет? Надо самому писать, либо чьей-то самоделкой воспользоваться?

Добавлено через 7 минут и 51 секунду
Похоже FloatToStrF работает со значением long double. А строка в double похоже конвертируется функцией ToDouble.
PM MAIL   Вверх
Нитонисе
Дата 4.9.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Цитата(FCM @  3.9.2012,  10:38 Найти цитируемый пост)
Погрешность погрешности будем величиной более малого порядка

Почему? Ведь при высилении погрешности оперируем крайне малыми числами, близкими к машинному епсилон. Очень вероятно, что относительная погрешность таких операций будет велика.
PM MAIL   Вверх
math64
Дата 4.9.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Погрешность хранится отдельно от числа, в виде с плавающей точкой - достаточно точно.
После прибавления к основному числу точность, да теряется.
Но ведь сравниваются же два числа так:
Код

if (abs(x-y) < dx + dy) { ... }

или если храним квадрат СКО, при нормальном распределении, с допуском 3 СКО:
Код

double delta = x.value-y.value;
if (delta*delta < (x.deviation2 + y.deviation2)*9) { ... }

Главное место где теряется точность - вычисление delta.
Нужно также следить, чтобы при вычислении квадрата не было переполнения и антипереполнения.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.