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

Поиск:

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


Вы это прекратите!
***


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

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



Цитата(Нитонисе @  27.8.2012,  16:09 Найти цитируемый пост)

Как же ж мне вычислить погрешность, когда у меня таких вчислений тысячи?  smile  параллельно основным вычислениям вести и расчет погрешности?

Если аналитическими методами не воспользоваться - да.

Цитата(Нитонисе @  27.8.2012,  16:09 Найти цитируемый пост)
Я посмотрел самое начало - как я понял книга предназначена для приближенных ручных вычислений. Думаю приближенный ручной счет и приближенный машинный - не стоит сравнивать. 


В данном случае разницы никакой. У машинных вычислений есть дополнительные особенности, но сначала все равно стоит разобраться с общей базой. И... не сочтите за наезд, но, судя по задаваемым вопросам, Вы с вычислительной математикой совершенно не знакомы, так что отдельными комментариями на форумах тут не отделаться.

Цитата(Нитонисе @  27.8.2012,  16:54 Найти цитируемый пост)
Дело в том, что это сложно. По одному и тому же алгоритму могут быть обсчитаны как очень крупные, так и очень малые числа... 

А Вы уверены, что Вашу задачу нельзя предварительно обезразмерить? Ситуации, когда параметры вычислительного алгоритма действительно необходимо менять на несколько порядков, в реальной жизни встречаются очень редко.
PM   Вверх
math64
Дата 27.8.2012, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

Approx a = Approx::fromDelta(1.5, 0.001); // a = 1.5 +- 0.001 // число с абс. погрешностью
Approx b = Approx::fromEps(0.8, 0.001; // b = 0.8 += 0.1% // число с относит. погрешностью
Approx c = a + b;
double v = c, delta = c.delta();// v - среднее значение, delta - абсолютная погрешность

Числа должны задаваться с погрешностью на порядок больше чем возможности представления числа в компьютере (иначе нужно заботиться о правильном округлении результата - сумму минимумов в меньшую сторону, сумму максимумов - в большую и т.д.)


Это сообщение отредактировал(а) math64 - 27.8.2012, 21:27
PM   Вверх
mrgloom
Дата 28.8.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 а вообще есть какая нибудь книжка про числа с плавающим знаком приминительно к численным методам?
PM MAIL   Вверх
Нитонисе
Дата 28.8.2012, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrgloom @  28.8.2012,  17:34 Найти цитируемый пост)
а вообще есть какая нибудь книжка про числа с плавающим знаком приминительно к численным методам?

Присоединяюсь к вопросу. Хотелось бы поподробнее разобраться с практической реализацией вычислений и оценкой точности.
PM MAIL   Вверх
Randajad
Дата 28.8.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А есть еще __float128...
PM MAIL   Вверх
bsa
Дата 28.8.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Нитонисе @  28.8.2012,  18:57 Найти цитируемый пост)
Присоединяюсь к вопросу. Хотелось бы поподробнее разобраться с практической реализацией вычислений и оценкой точности. 

Все очень просто. В компьютерах числа с плавающей точкой представлены в виде структуры, состоящей из 4-х полей: знак мантиссы (+ или -), мантисса (собственно само число), знак экспоненты и сама экспонента (степень двойки). Легче всего это понять тем, кто хорошо знает физику. Там всегда числа представлены в виде: +1,23456 * 10^-10. Тут тоже самое (+0100101 * 2 ^ -010111011). В отличие от физики у машин, обычно, все числа имеют ограничения по количеству знаков (т.е. цифр). Например, число одинарной точности может иметь 23 разряда мантиссы. Таким образом, это где-то 7-8 десятичных знаков. А теперь представим, что у нас есть число 1,2345678 и мы прибавляем к нему 0,00000001. Ожидается результат 1,23456781; но будет, например, 1,2345678. Это и есть одна из основных проблем. Именно поэтому числа с плавающей точкой нельзя использовать для финансовых расчетов. Другая проблема заключается в том, что числа могут быть почти равными, но не быть равными. При выводе на экран они равны, но операция сравнения возвращает false. Именно поэтому необходимо всегда сравнивать модуль разницы таких чисел с некоторым "малым числом" (эпсилон), которое выбирается согласно поставленной задаче, так как самая малая разница чисел с экспонентой +30 будет отличаться от самой большой для чисел с экспонентой -20.
Детально: Число одинарной точности
PM   Вверх
mrgloom
Дата 29.8.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://redwood.berkeley.edu/w/images/b/bd/20080815pi.pdf

наткнулся на статью по CUDA  и Floating Point.

например страница 15-16 не знал что так бывает и что вообще надо над этим задумываться.
PM MAIL   Вверх
FCM
Дата 29.8.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrgloom @  28.8.2012,  17:34 Найти цитируемый пост)
а вообще есть какая нибудь книжка про числа с плавающим знаком приминительно к численным методам? 


http://www.softelectro.ru/ieee754.html

Кроме того, полезным будет посмотреть начало
Вержбицкий "Основы численных методов" 2-ое изд-е М.: "Высшая школа" 2005.
PM MAIL   Вверх
Нитонисе
Дата 29.8.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



FCM, немного не то. По вашей ссылке описано как хранит числа с плавающей запятой компьютер. Меня же больше интересует как программировать с учетом способа записи таких чисел компьютером. Некоторые примеры в описании стандарта автор привел, но это так - для общего сведения. Хотелось бы более почитать более объемную и системную работу в этом направлении. 
PM MAIL   Вверх
math64
Дата 29.8.2012, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нитонисе, если не волнует скорость вычислений, может восползоваться классом Approx (дописав нехватающие методы)
Принципы такие:
- каждое приближённое число хранится в виде пары (min, max)
- при каждом действии (сложение, вычитание, умножение, деление, ...) вычисляются новые (min, max).
- с учётом того, как хранятся данные в компьютере, min округляется в меньшую сторону, max в большую.
- при делении на число, приблизительно равное 0, результат (-DBL_MAX, DBL_MAX)
- если есть две формулы для вычислений (как я показывал на примере квадратного уравнения) можно почитать по обеим и объединить результаты.

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


Опытный
**


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

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



Цитата(Нитонисе @  29.8.2012,  11:49 Найти цитируемый пост)
FCM, немного не то. По вашей ссылке описано как хранит числа с плавающей запятой компьютер. Меня же больше интересует как программировать с учетом способа записи таких чисел компьютером. Некоторые примеры в описании стандарта автор привел, но это так - для общего сведения. Хотелось бы более почитать более объемную и системную работу в этом направлении. 


Вержбицкого все же посмотри и указанную там библиографию.
А вообще -  "Двойная точность - вежливость программистов" Саттер. 
PM MAIL   Вверх
Нитонисе
Дата 30.8.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А насколько перспективна идея представлять все числа в виде дробей?
Код

class TNumber
{
    private:
        int Numerator;      // числитель
        int Denominator;   // знаменатель
        int Exp;                 // степень дополнительного множителя (десятка) для числителя (для больших чисел)
}

PM MAIL   Вверх
math64
Дата 30.8.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если у тебя только операции + - * / можешь работать с дробями. Но вероятно, точности int и даже int64 не хватит

a/b + c/d = (a*d + b*c)/(b*d)

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

Ещё можно хранить числа в виде (мат. ожидание, среднее квадратическое отклонение), полагая что распределение близкое к нормальному.
PM   Вверх
Нитонисе
Дата 30.8.2012, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



максимальное значение int - 2 147 483 647. Любую последовательность чисел можно представить 9-ю разрядами, если реальное число требует больше, то можно выделить еще один int для второй части числа из 9-ти разрядов. То есть например число 999 999 999 888 888 888 будет храниться в двух переменных типа int, в одной будет 999 999 999, во второй 888 888 888, только надо придумать как оперировать такими числами.
PM MAIL   Вверх
math64
Дата 30.8.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как хранить число в двух int думать не надо, для этого есть __int64 (long long в gcc).
Для более длинных целых чисел можно найти в инете соответствующую библиотеку.
С помощью такой библиотеки можно посчитать Пи с тысячью знаков после запятой.
Только при хранении чисел в виде дробей это чаще всего будет не оправдано.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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