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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потеря точности при использовании double 
:(
    Опции темы
Solut
Дата 29.4.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
У меня возникла следующая проблема:
в программе есть перемееная h типа double (равная 0.000001). При выполнении следующих операций (для примера): 1+h*1, получаю 1. То есть на сколько я понимаю, идёт потеря точности. У Прата в книге по С++ рассмотрена данная проблема, но путей её решения нет. Но мне для алгоритма очень важна эта точность.
Надеюсь, на Вашу помощь.
Заранее спасибо!
PM MAIL   Вверх
Дрон
Дата 29.4.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Нужно либо пытаться преобразовывать выражения.
Приводи реальные формулы, будем вместе думать smile

Или можно сделать собственный тип данных типа fixed point.


--------------------
Да. Именно так.
PM   Вверх
Solut
Дата 29.4.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, в каждом.
Результат - выше.
PM MAIL   Вверх
AISIN
Дата 29.4.2005, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я сделал так
Код

double h=0.000001;

int main()
{
        double *men=new double[2];
        double *y1=new double[2];
        double p[2];
        p[0]=1.0;
        men[0]=1;
        y1[0]=men[0]+h*p[0];
        cout<<"lll"<<endl;
        printf("%f",y1[0]);
        cout<<endl;
                   return 0;
}

ответ получился
Код

lll
1.000001

а если с помощью cout выводить то ответ еденица

--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
Solut
Дата 29.4.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Значит, насколько я понимаю в компьютере будет 1.000001.
А если мне нужно 1.000000000000001 - это уже long double?
Заранее огромное спасибо!
PM MAIL   Вверх
Дрон
Дата 29.4.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(AISIN @ 29.4.2005, 21:56)
а если с помощью cout выводить то ответ еденица

Ну это тогда не потеря точности, а просто cout округляет при выводе на экран.
В printf'е вообще можно задать количество знаков после запятой printf("%.8f",yl[0]) выведет с 8 знаками (вроде бы так, никак не могу нормально запомнить его формат smile )


--------------------
Да. Именно так.
PM   Вверх
Artiom
Дата 30.4.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

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



для cout тоже можно задавать формат вывода. Короче здесь потери точности не происходит - просто округляется при выводе


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
pablo
Дата 30.4.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



[/b]Artiom [b] прав, вот пример того что он сказал.
Код проверен и 100% работает.

Код

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    double value = 0.00000000000000002;
    
    cout.setf(ios::fixed | ios::showpoint);
    cout << setprecision(20) << value << endl;
    
    system("pause");
}


Добавлено @ 13:53
Кстати флаги форматирования (ios::fixed и ios::showpoint) надо указывать обязательно. Точность вывода указывается функцией setprecision(int value);



--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Гость_En_t_end
Дата 30.4.2005, 14:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ещё хорошо бы пользоваться static_cast<>() для преобразования типов нужных операндов, ибо при a = c/b; Где a and b - double, но с - int Ответ будет автоматом округлен к наименьшему варианту. Причем дробная часть вообще отпадает.
  Вверх
AISIN
Дата 30.4.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Насчет точности
float кол-во точных цифр после точки 6.
double- 15
long double - 19. Остальные числа являются случайными.
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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