|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.12.2007, 12:44 | #1 |
Регистрация: 26.11.2007
Сообщений: 5
|
диапазон double и погрешности вычислений
в некоторых серьезных вычислительных программах (например работа с матрицами) встречается такая вещь:
среди обрабатываемых элеменов ищется наибольший, потом на это значение делятся все эти элементы. после этой операции элементы обрабатываются, и теперь уже умножаются на то же число. в принципе понятно зачем это делается - чтобы не вылететь из диапазона типа. НО : не может ли при этом оказаться, что мы потеряем значение за счет того, что число будет слишком маленьким (опять же выход за границы типа)? как быть с погрешностью вычислений, ведь при делении она наиболее ощутима, да потом еще и умножение дает о себе знать? какие по модулю наибольшее и наименьшее значения может принимать тип double? Последний раз редактировалось ilyagoo; 11.12.2007 в 12:48. |
11.12.2007, 13:49 | #2 |
Форумчанин
Регистрация: 25.09.2007
Сообщений: 189
|
какие по модулю наибольшее и наименьшее значения может принимать тип double можно узнать в любой книжке по Си++
а по вопросу: если тебе нужна такая огромная точность, что и double и long double тебе недостаточно, то можешь воспользоваться специальными библиотеками, в которых числа представляются в виде дробей и размер их ограничен лишь памятью твоего компьютера (в double, только 8 байт, если не ошибаюсь) |
11.12.2007, 18:19 | #3 |
Форумчанин
Регистрация: 10.12.2007
Сообщений: 158
|
для любого числа (double)х погрешность составит примерно х * 1е-16. То есть в мантиссе помещается 15 - 16 значащих цифр (не помню сколько бит точно). -> чем ближе к 0, тем выше точность.
(имеется ввиду, что для double x + x * 1e-16= x) для long double и пр. можно написать программку, которая считает эту точность. Если библиотеки с бесконечной точностью (пока памяти хватает) |
12.12.2007, 09:34 | #4 | |
Регистрация: 26.11.2007
Сообщений: 5
|
Цитата:
а тут наверно x (+/-) x * 1e-16= x а как насчет деления и последующего умножения? что делать с этими погрешностями? имеет ли смысл делить не на максимальное число из набора, а на 10^(порядок наибольшего числа), или при таком делении погрешности тоже не избежать? вроде бы на 100 делить проще,чем на 93, например. хотя это проще в человеческом представлении, а как в машинном? ------ да, кстати, в книжках написано, что double (1.7e+/-308), про это я в курсе ------ еще такой вопрос: pascal и с по-разному считают? в одной и той же программе промежуточные вычисления близкие к нулю возвращают разные результаты. |
|
13.12.2007, 17:29 | #5 |
Форумчанин
Регистрация: 10.12.2007
Сообщений: 158
|
Да, +/-
------------ При делении мантиссы делятся друг на друга - добавляется соотв. погрешность (очень небольшая, посчитай сам). А порядки просто вычитаются. Вообще относительная погрешность от порядка не зависит. Деля на 10^... ты её не изменишь (мантисса 10^... есть 1). Но вообще я не думаю, что для тебя сыграет настолько сильную роль отн. погрешность в 0.00..01%. -------- В паскале представление вещ. чисел то же самое (оно везде одинаковое для стандартных типов), разница может быть из-за различия типов. Я просто мало на паскале прогал, и не помню real это float или double. Насчёт счёта - вроде одинаково, но пусть точно лучше отпишет кто-то более компетентный в вопросах паскаля. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. | 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 |