2015-10-09 2 views
2

Глядя на имя и 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:

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

ответ

2

То, что вы видите, скорее всего связано с цифрами охраны, используемыми внутри страны. Причина в том, что даже десятичное представление имеет ограниченную точность (думаю («100,0»/«3,0») * «3,0»).

Для получения разумных ошибок округления во время расчетов сохраненная точность будет больше, чем гарантированная точность.

Подводя итог: всегда будьте конкретны в отношении ожидаемой точности. В вашем примере d.str(50).

(В реалистичных сценариях, вы должны хотеть, чтобы отслеживать точность ваших входов и вывести точность на своих выходах. Чаще всего, люди просто резерв избыточную точность и печатать только часть они заинтересованы в)

+0

Btw, можете ли вы добавить ссылку для этой цитаты? – maxschlepzig

+0

@maxschlepzig Я сам это сказал. Предполагалось, что это «боковая панель». Логика, на которую я указываю, - это научное измерение с явными ошибками. – sehe

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