Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
like-nix
351 / 32 / 6
Регистрация: 02.07.2008
Сообщений: 311
#1

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

15.10.2009, 14:37. Просмотров 1985. Ответов 3
Метки нет (Все метки)

Всем привет!

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

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

Арифметические операции:
C++
1
double test_k = 1495.0 * 0.00001;
test_k = 0.014950000000000001

Преобразования:
C++
1
2
3
4
  char buffer [50];
  double a=5.38986;
  sprintf(buffer, "%f", a);
  sscanf(buffer, "%lf", &test_k);
test_k = 5.3898599999999997

В обоих случаях получаем погрешность. Как сделать так чтобы не было погрешности в вычислениях?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2009, 14:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Точности вычислений и преобразований double (C++):

Точности вычислений double - C++
Вот у меня возникла проблема при подсчете ряда тейлора в заданном интервале. Проблема заключается в том, что когда я ввижу интервал и...

Потеря точности у double - C++
Салют! Ситуация следующая - есть необходимость работать с изображением, а точнее - с его градиентом/направлением градиента. Для...

float и double (расчет точности) - C++
Всем привет, а есть какой-нибудь алгоритм по расчету точности типов float и double а то прочитал, чтобы получить точность типа double...

Расчет точности для float и double - C++
По какой формуле рассчитывается точность float и double в количестве знаков после запятой отностительно целой части? Чтобы вопрос был более...

Потеря точности числа формата double - C++
Вечер добрый, товарищи. Вопрос следующий: как можно избежать потери точности при перемножении двух чисел типа double? В каждом числе,...

Точность вычислений у double - C++
Дана задача: "Определить, на сколько нулей заканчивается факториал числа n". Пример: вводим "25", на выходе должны получить "6" (25! =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.10.2009, 14:54 #2
like-nix, никак. Напиши свою функцию Round для округления с заданной точностью
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
15.10.2009, 15:05 #3
В процессоре вещественные числа представлены неточно - а с какой-то заданной точностью.
like-nix
351 / 32 / 6
Регистрация: 02.07.2008
Сообщений: 311
15.10.2009, 16:42  [ТС] #4
Важное дополнение, достаточно будет точности в 4 разряда.

like-nix, сейчас идея такая:

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 погрешность очень маленькая, или я ошибаюсь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2009, 16:42
Привет! Вот еще темы с ответами:

Накопление погрешности вычислений с double - C++
Добрый день, столкнулся с такой проблемой: при нескольких (около 30) последовательных умножениях матриц базисов накапливается погрешность...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Неоднозначность преобразований. Как задать "приоритет" преобразований - C++
В моем классе есть три функции преобразования (int, double, char), и все они мне нужны. Но мне нужно, чтобы когда я явно не указываю, во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.10.2009, 16:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru