![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Фантом |
|
||||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
Если аналитическими методами не воспользоваться - да. В данном случае разницы никакой. У машинных вычислений есть дополнительные особенности, но сначала все равно стоит разобраться с общей базой. И... не сочтите за наезд, но, судя по задаваемым вопросам, Вы с вычислительной математикой совершенно не знакомы, так что отдельными комментариями на форумах тут не отделаться.
А Вы уверены, что Вашу задачу нельзя предварительно обезразмерить? Ситуации, когда параметры вычислительного алгоритма действительно необходимо менять на несколько порядков, в реальной жизни встречаются очень редко. |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Числа должны задаваться с погрешностью на порядок больше чем возможности представления числа в компьютере (иначе нужно заботиться о правильном округлении результата - сумму минимумов в меньшую сторону, сумму максимумов - в большую и т.д.) Это сообщение отредактировал(а) math64 - 27.8.2012, 21:27 |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
а вообще есть какая нибудь книжка про числа с плавающим знаком приминительно к численным методам?
|
|||
|
||||
Нитонисе |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: нет Всего: 2 |
||||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
А есть еще __float128...
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Все очень просто. В компьютерах числа с плавающей точкой представлены в виде структуры, состоящей из 4-х полей: знак мантиссы (+ или -), мантисса (собственно само число), знак экспоненты и сама экспонента (степень двойки). Легче всего это понять тем, кто хорошо знает физику. Там всегда числа представлены в виде: +1,23456 * 10^-10. Тут тоже самое (+0100101 * 2 ^ -010111011). В отличие от физики у машин, обычно, все числа имеют ограничения по количеству знаков (т.е. цифр). Например, число одинарной точности может иметь 23 разряда мантиссы. Таким образом, это где-то 7-8 десятичных знаков. А теперь представим, что у нас есть число 1,2345678 и мы прибавляем к нему 0,00000001. Ожидается результат 1,23456781; но будет, например, 1,2345678. Это и есть одна из основных проблем. Именно поэтому числа с плавающей точкой нельзя использовать для финансовых расчетов. Другая проблема заключается в том, что числа могут быть почти равными, но не быть равными. При выводе на экран они равны, но операция сравнения возвращает false. Именно поэтому необходимо всегда сравнивать модуль разницы таких чисел с некоторым "малым числом" (эпсилон), которое выбирается согласно поставленной задаче, так как самая малая разница чисел с экспонентой +30 будет отличаться от самой большой для чисел с экспонентой -20. Детально: Число одинарной точности |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
http://redwood.berkeley.edu/w/images/b/bd/20080815pi.pdf
наткнулся на статью по CUDA и Floating Point. например страница 15-16 не знал что так бывает и что вообще надо над этим задумываться. |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
http://www.softelectro.ru/ieee754.html Кроме того, полезным будет посмотреть начало Вержбицкий "Основы численных методов" 2-ое изд-е М.: "Высшая школа" 2005. |
|||
|
||||
Нитонисе |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: нет Всего: 2 |
FCM, немного не то. По вашей ссылке описано как хранит числа с плавающей запятой компьютер. Меня же больше интересует как программировать с учетом способа записи таких чисел компьютером. Некоторые примеры в описании стандарта автор привел, но это так - для общего сведения. Хотелось бы более почитать более объемную и системную работу в этом направлении.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Нитонисе, если не волнует скорость вычислений, может восползоваться классом Approx (дописав нехватающие методы)
Принципы такие: - каждое приближённое число хранится в виде пары (min, max) - при каждом действии (сложение, вычитание, умножение, деление, ...) вычисляются новые (min, max). - с учётом того, как хранятся данные в компьютере, min округляется в меньшую сторону, max в большую. - при делении на число, приблизительно равное 0, результат (-DBL_MAX, DBL_MAX) - если есть две формулы для вычислений (как я показывал на примере квадратного уравнения) можно почитать по обеим и объединить результаты. |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Вержбицкого все же посмотри и указанную там библиографию. А вообще - "Двойная точность - вежливость программистов" Саттер. |
|||
|
||||
Нитонисе |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: нет Всего: 2 |
А насколько перспективна идея представлять все числа в виде дробей?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если у тебя только операции + - * / можешь работать с дробями. Но вероятно, точности int и даже int64 не хватит
a/b + c/d = (a*d + b*c)/(b*d) если дробь несократимая, может получиться переполнение в знаметателе. exp особо не поможет - будут округления и нужно будет все равно оценивать ошибку вычислений. Ещё можно хранить числа в виде (мат. ожидание, среднее квадратическое отклонение), полагая что распределение близкое к нормальному. |
|||
|
||||
Нитонисе |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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, только надо придумать как оперировать такими числами.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Как хранить число в двух int думать не надо, для этого есть __int64 (long long в gcc).
Для более длинных целых чисел можно найти в инете соответствующую библиотеку. С помощью такой библиотеки можно посчитать Пи с тысячью знаков после запятой. Только при хранении чисел в виде дробей это чаще всего будет не оправдано. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |