Точность вычислений и преобразований double
Вопрос точности вычислений и преобразований double.
Объясните пожалуйста следующее:
Арифметические операции:
test_k = 0.014950000000000001
Преобразования:
double a=5.38986;
sprintf(buffer, "%f", a);
sscanf(buffer, "%lf", &test_k);
test_k = 5.3898599999999997
В обоих случаях получаем погрешность. Как сделать так чтобы не было погрешности в вычислениях?
Ну а вообще, в вычислениях в дискретной среде всегда будет присутствовать погрешность.
Возможно, вам нужно при выводе получить 4 разряда после запятой. Тогда делаем так:
printf("%.4f", a);
Я реализовал класс Sdouble, который будет реализовывать операции с типом double, с определенной точностью.
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 погрешность очень маленькая, или я ошибаюсь?
Значит остается вопрос как мне например из 5.45352345234523452345 получить 5.45350000000000000000
Есть у кого нибудь какие ниьудб идеи как должна выглядеть функция supp_val_degree?
Я так понимаю что при вычислениях с разрядносью 4 погрешность очень маленькая, или я ошибаюсь?
double ost = value % 0,0001;
value = value / 0,0001;
if(ost >= 0,00005) value += 0,0001;
return value;
как то так примерно
Раз уж добрались до создания специального класса может тогда смотреть в сторону чисел с фиксированной, а не с плавающей запятой?
inline SDouble& operator= (const SDouble&) const;
Это, конечно, сильно...
Тут, я кстати, совсем не понял: человечек обернул double?
inline SDouble& operator= (const SDouble&) const;
Это, конечно, сильно...
Ну хоть с арифметикой не наconstячил... А mutable - это, для некоторых, вообще вышка :D
Что там он обернул - я и сам не понял. Но раз человек готов писать специальные классы, то почему бы не сделать класс для числа с фиксированной запятой? Таким образом получим достоинства (и недостатки) операций с целыми числами. Например, при умножении мы получим то, что требовалось, если не будет переполнения.
В gcc вроде бы ввели такие числа, но я не разбирался как с ними работать. Может еще есть какие-нибудь сторонние библиотеки.
{
double nom=pow(10, prec);
return rint (val*nom)/nom;
}
inline SDouble& operator= (const SDouble&) const;
Это, конечно, сильно...
lol спасибо дружище я тоже посмеялся, я переconstячил =)
Так ведь развлечения бы лишились:D
Ммм. Видимо просто потому, что вы не сказали, какая перед вами стоит задача.