Глядя на имя и Boost Multiprecision documentation я ожидал бы, что cpp_dec_float_50
тип данных имеет точность 50 десятичных цифр:Какова точность cpp_dec_float_50?
Использование ЬурейеЕ cpp_dec_float_50 скрывает сложность multiprecision, чтобы позволить нам определить переменные с 50 десятичных цифр точностью, как встроенный двойной.
(Хотя я не понимаю, сравнение с двойным - я имею в виду, как правило, реализует double
двоичное с плавающей точкой арифметика, не десятичную арифметику с плавающей точкой.)
Это также соответствует выходным сигналом следующего кода (за исключением двойной части, но это ожидается):
cout << std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::digits10
<< '\n';
// -> 50
cout << std::numeric_limits<double>::digits10 << '\n';
// -> 15
Но почему следующий код печатает 74 цифры?
#include <boost/multiprecision/cpp_dec_float.hpp>
// "12" repeated 50 times, decimal point after the 10th digit
boost::multiprecision::cpp_dec_float_50 d("1212121212.121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212");
cout << d.convert_to<string>() << '\n';
// Expected output: 50 digits
// Actual output: 74 digits
// -> 1212121212.1212121212121212121212121212121212121212121212121212121212121212
Функция str()
член работает как ожидалось, например,
cout << d.str(50) << '\n';
делает печать только 50 цифр - где it is documented as:
Возвращает число, отформатированный в виде строки, по крайней мере с точностью цифр, так и в научном формате, если научная правда.
Btw, можете ли вы добавить ссылку для этой цитаты? – maxschlepzig
@maxschlepzig Я сам это сказал. Предполагалось, что это «боковая панель». Логика, на которую я указываю, - это научное измерение с явными ошибками. – sehe