2016-12-17 12 views
0

Рассмотрим следующий код:Как точно увеличить точность mpreal?

#include <iostream> 
#include <mpreal.h> 
using namespace std; 
using mpfr::mpreal; 

mpreal x("1.001",64); 
mpreal y("1.0",64); 
y*=x; 
cout<<y<<endl; //1 
y.set_prec(128); 
cout<<y<<endl; //2 

Выходы

1,001

1,00100000000000000002081668171172168513

Я желаю, чтобы второй выход что-то вроде

1,00100000000000000000000000000000000000

На самом деле, я узнал, что один может заменить

y.set_prec(128); 

в

y=mpreal(y.toString(),128); 

Но этот вид преобразования отнимает много времени.

Есть ли способ лучше/быстрее?

Спасибо!

+0

Вы уже выбрали эту точность, когда вы выполнили «mpreal x (« 1.001 », 64);». Вы не можете вернуть его после этого факта. – user2357112

ответ

0

Лучше настроить точность по всему миру, так что все переменные mpreal будут создаваться с такой точностью по умолчанию. Вызов следующей функции перед созданием mpreal номера:

mpfr::mpreal::set_default_prec(mpfr::digits2bits(N)); 

mpreal x("1.001"); // second argument is not required anymore 
mpreal y("1.0"); 
... 

где N требуется точность десятичных цифр.

Двоичные числа с плавающей запятой не дают фактической десятичной точности, это всего лишь приближения к действительным числам. Больше бит в представлении = более высокая точность приближения. Но некоторые цифры никогда не могут быть представлены точно в двоичном формате. 1.001 является одним из них. Таким образом, вы всегда увидите не-нули, начиная с некоторой позиции в двоичном представлении числа 1.001.

Проверьте, пожалуйста, What Every Computer Scientist Should Know About Floating Point Arithmetic.

+0

Хорошо, настройка точности по умолчанию - это, безусловно, способ сделать программу эффективной. Благодаря! – sunhex