Настройка точности на 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, как представляется, задана точность результатов, основанная на точной точности данных.
'bc' имеет бесконечную точность,' double' в C++ этого не делает. – Barry
Вам нужно использовать фиксированное десятичное число точности, которое может представлять это вообще. 'double' не поддерживает это. –
Стандартные удвоения обычно имеют только 64 бит точности, что намного меньше 100 значащих цифр. Вам нужно будет использовать произвольную математическую библиотеку точности, если вы этого хотите. –