Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2007, 12:44   #1
ilyagoo
 
Регистрация: 26.11.2007
Сообщений: 5
Вопрос диапазон double и погрешности вычислений

в некоторых серьезных вычислительных программах (например работа с матрицами) встречается такая вещь:
среди обрабатываемых элеменов ищется наибольший, потом на это значение делятся все эти элементы. после этой операции элементы обрабатываются, и теперь уже умножаются на то же число.
в принципе понятно зачем это делается - чтобы не вылететь из диапазона типа. НО : не может ли при этом оказаться, что мы потеряем значение за счет того, что число будет слишком маленьким (опять же выход за границы типа)? как быть с погрешностью вычислений, ведь при делении она наиболее ощутима, да потом еще и умножение дает о себе знать? какие по модулю наибольшее и наименьшее значения может принимать тип double?

Последний раз редактировалось ilyagoo; 11.12.2007 в 12:48.
ilyagoo вне форума Ответить с цитированием
Старый 11.12.2007, 13:49   #2
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

какие по модулю наибольшее и наименьшее значения может принимать тип double можно узнать в любой книжке по Си++
а по вопросу: если тебе нужна такая огромная точность, что и double и long double тебе недостаточно, то можешь воспользоваться специальными библиотеками, в которых числа представляются в виде дробей и размер их ограничен лишь памятью твоего компьютера (в double, только 8 байт, если не ошибаюсь)
Alek86 вне форума Ответить с цитированием
Старый 11.12.2007, 18:19   #3
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

для любого числа (double)х погрешность составит примерно х * 1е-16. То есть в мантиссе помещается 15 - 16 значащих цифр (не помню сколько бит точно). -> чем ближе к 0, тем выше точность.

(имеется ввиду, что для double x + x * 1e-16= x)

для long double и пр. можно написать программку, которая считает эту точность. Если библиотеки с бесконечной точностью (пока памяти хватает)
theos вне форума Ответить с цитированием
Старый 12.12.2007, 09:34   #4
ilyagoo
 
Регистрация: 26.11.2007
Сообщений: 5
Счастье

Цитата:
Сообщение от theos Посмотреть сообщение
для любого числа (double)х погрешность составит примерно х * 1е-16. То есть в мантиссе помещается 15 - 16 значащих цифр (не помню сколько бит точно).
спасибо, собственно это я и ожидал услышать
а тут наверно x (+/-) x * 1e-16= x
а как насчет деления и последующего умножения? что делать с этими погрешностями?
имеет ли смысл делить не на максимальное число из набора, а на 10^(порядок наибольшего числа), или при таком делении погрешности тоже не избежать? вроде бы на 100 делить проще,чем на 93, например. хотя это проще в человеческом представлении, а как в машинном?
------
да, кстати, в книжках написано, что double (1.7e+/-308), про это я в курсе
------
еще такой вопрос: pascal и с по-разному считают? в одной и той же программе промежуточные вычисления близкие к нулю возвращают разные результаты.
ilyagoo вне форума Ответить с цитированием
Старый 13.12.2007, 17:29   #5
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Да, +/-
------------
При делении мантиссы делятся друг на друга - добавляется соотв. погрешность (очень небольшая, посчитай сам). А порядки просто вычитаются. Вообще относительная погрешность от порядка не зависит. Деля на 10^... ты её не изменишь (мантисса 10^... есть 1). Но вообще я не думаю, что для тебя сыграет настолько сильную роль отн. погрешность в 0.00..01%.
--------
В паскале представление вещ. чисел то же самое (оно везде одинаковое для стандартных типов), разница может быть из-за различия типов. Я просто мало на паскале прогал, и не помню real это float или double. Насчёт счёта - вроде одинаково, но пусть точно лучше отпишет кто-то более компетентный в вопросах паскаля.
theos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. Dorvir Microsoft Office Excel 12 23.05.2008 22:11
VB6.0 График зависимости погрешности от количества отрезков интегрирования. XenoS Помощь студентам 1 22.05.2008 10:22
косяк при организации итерационных вычислений redfield Microsoft Office Excel 3 04.09.2007 21:35
Double/? Viteef Общие вопросы Delphi 6 25.07.2007 02:28
Символьный массив и double dima Общие вопросы C/C++ 5 15.12.2006 03:52