Точность вычислений и преобразований double.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
like-nix
Сообщения: 8
Зарегистрирован: 13 окт 2008, 16:01

Всем привет!

Вопрос точности вычислений и преобразований double.

Объясните пожалуйста следующее:

Арифметические операции:

Код: Выделить всё

double test_k = 1495.0 * 0.00001;
test_k = 0.014950000000000001

Преобразования:

Код: Выделить всё

  char buffer [50];
  double a=5.38986;
  sprintf(buffer, "%f", a);
  sscanf(buffer, "%lf", &test_k);
test_k = 5.3898599999999997

В обоих случаях получаем погрешность. Как сделать так чтобы не было погрешности в вычислениях?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Важное дополнение, достаточно будет точности в 4 разряда.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Один из вариантов - округлять до какого-то знака.

Сделать так, чтобы погрешности не было вообще не получится: всё из-за того, что не всякое вещественное число можно представить счётным количеством знаков после запятой без погрешности.

Вот хорошая статья на эту тему:
http://rsdn.ru/article/alg/float.xml
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Источник твоего глюка в том, что ты имеешь ограниченную точность двоичного представления дроби и пытаешься перевести её в десятичную. Отсюда и погрешность младшего разряда десятичного представления.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить