2015-04-05 3 views
-3
... 
cout << setprecision(100) << pow((3+sqrt(5.0)),28) << endl; 
... 

выходыНевозможно сделать ++ использовать программу C довольно точно

135565048129406451712 

, который не является достаточно точным, но.

$ bc <<< "scale = 100; (3+sqrt(5.0))^28" 

выходы

135565048129406369791.9994684648068789538123313610677119237534230237579838585720347675878761558402979025019238688523799354 

чего я хочу. Я устанавливаю точность cout так, что это должно быть sqrt, pow или + теряют точность?

+0

'bc' имеет бесконечную точность,' double' в C++ этого не делает. – Barry

+0

Вам нужно использовать фиксированное десятичное число точности, которое может представлять это вообще. 'double' не поддерживает это. –

+2

Стандартные удвоения обычно имеют только 64 бит точности, что намного меньше 100 значащих цифр. Вам нужно будет использовать произвольную математическую библиотеку точности, если вы этого хотите. –

ответ

2

Настройка точности на cout не влияет на то, как выполняется базовое вычисление на C++. float s обычно имеют около 8 цифр точности, doubles около 16; ваш вывод на C++ содержит только первые 15 цифр, соответствующих выходу bc.

Если вам нужна более высокая точность, вам придется использовать другой метод, такой как произвольная цифровая библиотека точности. Вот как программа bc реализует произвольную математику точности.

Например, с помощью:

https://gmplib.org

#include <gmp.h> 
#include <gmpxx.h> 

#include <iostream> 
#include <iomanip> 

int main() { 
    mpf_set_default_prec(402); 

    mpf_class a = 3_mpf + sqrt(5_mpf); 
    mpf_class output; 
    mpf_pow_ui(output.get_mpf_t(), a.get_mpf_t(), 28); 

    std::cout << std::setprecision(121); 
    std::cout << output << '\n'; 
} 

печатается:

135565048129406369791,9994684648068789538123313610677119237534230237579838585720347675878761558402979528909982661363879709

Интересно, что это отличается от вывода bc <<< "scale = 100; (3+sqrt(5.0))^28", но если вы установите масштаб выше для bc, вы увидите, что вывод gmp верен.

Похоже, что bc готов распечатать сколько бы цифр он ни был, даже если операнды для выражений, которые произвели эти цифры, не имели достаточной точности, чтобы получить их право. В отличие от GMP, как представляется, задана точность результатов, основанная на точной точности данных.

+0

Исправлено, за исключением ложного утверждения о том, что объект любого заданного типа с плавающей запятой имеет некоторую предопределенную точность в соответствии с абстракцией, которая является C++. –