2015-04-22 4 views
5

10^1.64605 = 44.2639330165Потеря точности при использовании Pow в C++

Однако в C++ с использованием pow:

double p = pow(10,1.64605) returns 44.2641. 

Есть ли способ, чтобы увеличить точность здесь? Я попробовал отличить обе стороны до long double, но это тоже не помогло.

Более интересным является:

cout<<p; 
double a = -1.64605; 
cout<<pow(10,-a); 
p = pow(10, (-p)); 
cout<<p; 

выход:

-1.64605 
44.2639 
44.2641 

Почему?

+2

За исключением использования Bignum lib, возможно, нет ничего лучше. – deviantfan

+0

при получении 44.2641 что вы используете для его отображения? отладчик? COUT? Printf? – diverscuba23

+1

попробуйте добавить #include , а затем cout << setprecision (10) << p и cout << setprecision (10) << pow (10 -a) – diverscuba23

ответ

7

cout урезает ваш двойник для отображения, но значение, рассчитанное pow, возможно, не менее точное, как вы ожидаете. О том, как получить более высокую точность отображения в консоли смотрите:

How do I print a double value with full precision using cout?

Я Сложной дал подталкивание со стороны Давидом.

Вы указали, что double p = pow(10,1.64605) returns 44.2641, но это неверно. Он возвращает 44.26393301653639156; без каких-либо спецификаторов форматирования это отображается как 44.2639 (как вы увидите ниже).

При cout исходное значение p во втором коде Snippit он отображает -1.64605 (за счет снижения точности форматирования), и вы при условии, что он является точно -1,64605 в то время как на самом деле где-то между -1.64605115. .. и -1.64605213 ..., которые делает в выражении cout << pow(10, (-p));

+1

Это царапины на поверхности, но на самом деле не доходит до сути проблемы. Например, убедитесь, что 'cout << pow (10,1.64605)' выводит даже с полной точностью. –

+0

Я не уверен, к чему вы клоните. Если вы говорите о «44.2641», он, очевидно, просто перепутал результаты своей программы, когда он опубликовал. – Qartar

+0

Нет, он этого не сделал. Объяснение точно так же, как описано в моем ответе. –

1

Ответ будет найден путем изучения p. Вы не показывали, как он был инициализирован.

Вы найдете, что p != a, даже если они отображаются одинаково, когда вы печатаете их на консоли. Когда вы печатали на консоли, вы печатали только первые 6 значащих десятичных цифр. Распечатайте оба значения до большей точности, и вы увидите, что они не равны.

Вы сказали, что:

double p = pow(10,1.64605); 

вычисляет 44.2641. Но это неправда. Если вы действительно выполняете этот код, вы увидите это.

double p = pow(10,1.64605); 
cout << p; 

выходы 44.2639.

Ваш код немного отличается от приведенного выше. Это:

cout << p; 
p = pow(10, (-p)); 
cout << p; 

Выход исходное значение p для полной точности и все будет обнаружено.

 Смежные вопросы

  • Нет связанных вопросов^_^