Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

15K
15 октября 2009 года
like-nix
46 / / 27.06.2007
Всем привет!

Вопрос точности вычислений и преобразований 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

В обоих случаях получаем погрешность. Как сделать так чтобы не было погрешности в вычислениях?
2.1K
15 октября 2009 года
wAngel
129 / / 23.11.2004
А что Вы хотите получить и чем Вас не устаривает результат?
Ну а вообще, в вычислениях в дискретной среде всегда будет присутствовать погрешность.
15K
15 октября 2009 года
like-nix
46 / / 27.06.2007
wAngel, дополнение, достаточно будет точности в 4 разряда.
15K
15 октября 2009 года
like-nix
46 / / 27.06.2007
Важное дополнение, достаточно будет точности в 4 разряда.
297
15 октября 2009 года
koodeer
1.2K / / 02.05.2009
В приведённых вами примерах точность вычислений гораздо больше 4 разрядов.
Возможно, вам нужно при выводе получить 4 разряда после запятой. Тогда делаем так:
 
Код:
double a=5.38986;
printf("%.4f", a);
15K
15 октября 2009 года
like-nix
46 / / 27.06.2007
Cейчас идея такая:

Я реализовал класс Sdouble, который будет реализовывать операции с типом double, с определенной точностью.

Код:
template <unsigned int precision>
class SDouble
{
public:
    // construction
    SDouble ();  // uninitialized
    SDouble (double fX);
    //copy constructor
    SDouble (const SDouble& rkSD);
   
    // assignment
    inline SDouble& operator= (const SDouble&) const;
   
    // comparison
    bool operator== (const SDouble&) const;
    bool operator!= (const SDouble&) const;
    bool operator<  (const SDouble&) const;
    bool operator<= (const SDouble&) const;
    bool operator>  (const SDouble&) const;
    bool operator>= (const SDouble&) const;
   
    //arithmetic operations himself
    inline SDouble operator+ (const SDouble&) const;
    inline SDouble operator- (const SDouble&) const;
    inline SDouble operator* (const SDouble&) const;
    inline SDouble operator/ (const SDouble&) const;
   
    // arithmetic updates
    inline SDouble& operator+= (const SDouble&);
    inline SDouble& operator-= (const SDouble&);
    inline SDouble& operator*= (const SDouble&);
    inline SDouble& operator/= (const SDouble&);
   
    //value
    double getValue();
private:
    //Функция преобразования произвольного double в double нужной точности
    double supp_val_precision(double);
    //double с определенной точностью
    double m_Value;
};



С помощью функции supp_val_degree выпоняем преобразование

Значит остается вопрос как мне например из 5.45352345234523452345 получить 5.45350000000000000000
Есть у кого нибудь какие ниьудб идеи как должна выглядеть функция supp_val_degree?
Я так понимаю что при вычислениях с разрядносью 4 погрешность очень маленькая, или я ошибаюсь?
2.1K
15 октября 2009 года
Norgat
452 / / 12.08.2009
Цитата:
С помощью функции supp_val_degree выпоняем преобразование

Значит остается вопрос как мне например из 5.45352345234523452345 получить 5.45350000000000000000
Есть у кого нибудь какие ниьудб идеи как должна выглядеть функция supp_val_degree?
Я так понимаю что при вычислениях с разрядносью 4 погрешность очень маленькая, или я ошибаюсь?



 
Код:
double value;

double ost = value % 0,0001;
value = value / 0,0001;

if(ost >= 0,00005) value += 0,0001;

return value;


как то так примерно
288
15 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Вся проблема в том, что значения этого типа в принципе хранятся "приблизительно". С этим тут уже ничего не поделаешь.
87
15 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: like-nix
Я реализовал класс Sdouble, который будет реализовывать операции с типом



Раз уж добрались до создания специального класса может тогда смотреть в сторону чисел с фиксированной, а не с плавающей запятой?

43K
15 октября 2009 года
loki231
76 / / 27.09.2009
// assignment
inline SDouble& operator= (const SDouble&) const;

Это, конечно, сильно...
9
15 октября 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Kogrom
Раз уж добрались до создания специального класса может тогда смотреть в сторону чисел с фиксированной, а не с плавающей запятой?


Тут, я кстати, совсем не понял: человечек обернул double?

Цитата: loki231
// assignment
inline SDouble& operator= (const SDouble&) const;

Это, конечно, сильно...


Ну хоть с арифметикой не наconstячил... А mutable - это, для некоторых, вообще вышка :D

87
16 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Lerkin
Тут, я кстати, совсем не понял: человечек обернул double?



Что там он обернул - я и сам не понял. Но раз человек готов писать специальные классы, то почему бы не сделать класс для числа с фиксированной запятой? Таким образом получим достоинства (и недостатки) операций с целыми числами. Например, при умножении мы получим то, что требовалось, если не будет переполнения.

В gcc вроде бы ввели такие числа, но я не разбирался как с ними работать. Может еще есть какие-нибудь сторонние библиотеки.

43K
16 октября 2009 года
loki231
76 / / 27.09.2009
 
Код:
double sup_val_precision (double val, int prec=4)
{
      double nom=pow(10, prec);
      return rint (val*nom)/nom;
}
15K
16 октября 2009 года
like-nix
46 / / 27.06.2007
Цитата: loki231
// assignment
inline SDouble& operator= (const SDouble&) const;

Это, конечно, сильно...


lol спасибо дружище я тоже посмеялся, я переconstячил =)

15K
16 октября 2009 года
like-nix
46 / / 27.06.2007
Интересно а почему сразу никто не сказал что идея с классом бред? =)
260
16 октября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: like-nix
Интересно а почему сразу никто не сказал что идея с классом бред? =)



Так ведь развлечения бы лишились:D

288
17 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: like-nix
Интересно а почему сразу никто не сказал что идея с классом бред? =)



Ммм. Видимо просто потому, что вы не сказали, какая перед вами стоит задача.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог