![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2005 Репутация: нет Всего: нет |
Здравствуйте!
У меня возникла следующая проблема: в программе есть перемееная h типа double (равная 0.000001). При выполнении следующих операций (для примера): 1+h*1, получаю 1. То есть на сколько я понимаю, идёт потеря точности. У Прата в книге по С++ рассмотрена данная проблема, но путей её решения нет. Но мне для алгоритма очень важна эта точность. Надеюсь, на Вашу помощь. Заранее спасибо! |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Нужно либо пытаться преобразовывать выражения.
Приводи реальные формулы, будем вместе думать Или можно сделать собственный тип данных типа fixed point. -------------------- Да. Именно так. |
|||
|
||||
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2005 Репутация: нет Всего: нет |
В качестве глобальной переменной :
double h=0.000001; В одной из функций: double* men=new double [n]; //затем данный массив заполняется необходимыми данными double* y1=new double [n]; //массив p передаётся в функцию в качестве параметра, имеет также тип double y1[i]=men[i]+h*p[i]; Для тестирования создаю масивы по 1 элементу, равному 1, в каждом. Результат - выше. |
|||
|
||||
| AISIN |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
Я сделал так
ответ получился
а если с помощью cout выводить то ответ еденица --------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
||||
|
|||||
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2005 Репутация: нет Всего: нет |
Значит, насколько я понимаю в компьютере будет 1.000001.
А если мне нужно 1.000000000000001 - это уже long double? Заранее огромное спасибо! |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Ну это тогда не потеря точности, а просто cout округляет при выводе на экран. В printf'е вообще можно задать количество знаков после запятой printf("%.8f",yl[0]) выведет с 8 знаками (вроде бы так, никак не могу нормально запомнить его формат -------------------- Да. Именно так. |
|||
|
||||
| Artiom |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1031 Регистрация: 11.3.2003 Где: Минск\Баку Репутация: нет Всего: 17 |
для cout тоже можно задавать формат вывода. Короче здесь потери точности не происходит - просто округляется при выводе
-------------------- Если тебя жизнь трахает, значит, ты ещё живой |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
[/b]Artiom [b] прав, вот пример того что он сказал.
Код проверен и 100% работает.
Добавлено @ 13:53 Кстати флаги форматирования (ios::fixed и ios::showpoint) надо указывать обязательно. Точность вывода указывается функцией setprecision(int value); -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| Гость_En_t_end |
|
|||
|
Unregistered |
Ещё хорошо бы пользоваться static_cast<>() для преобразования типов нужных операндов, ибо при a = c/b; Где a and b - double, но с - int Ответ будет автоматом округлен к наименьшему варианту. Причем дробная часть вообще отпадает.
|
|||
|
||||
| AISIN |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
Насчет точности
float кол-во точных цифр после точки 6. double- 15 long double - 19. Остальные числа являются случайными. --------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |