2015-01-03 2 views
3

я узнал из wikipedia, что двойное число имеет не более 15-17 значащих десятичных цифр15-17 Значительное десятичное значение для двоичного кода64?

Однако для простой программы C++ ниже

double x = std::pow(10,-16); 
std::cout<<"x="<<std::setprecision(100000)<<x<<std::endl; 

(Чтобы проверить это, используйте this online shell), я получаю

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17 

, который имеет 88 значащих десятичных цифр, которые, по-видимому, противоречит вышеупомянутой претензии из Wiki. Может ли кто-нибудь уточнить, я должен что-то неправильно понять? Благодарю.

+0

Большая часть этих цифр * не * значительна; большинство из них не помогают отличить это значение от следующего наибольшего или минимально возможного значения «double». –

+1

@ Давид: Я проголосовал за повторное открытие (не понимая, что у меня есть решающий голос из-за моего золотого значка ...); Я считаю, что это не [стандарт «почему FP ломается?» - вопрос типа] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken); он задает вопрос о явном несоответствии между стандартными утверждениями о точности и поведением 'setprecision'. –

+1

@OliverCharlesworth Я считаю, что это тот же старый вопрос, который, как всегда, о представимости –

ответ

6

Нет противоречия. Как вы можете видеть, значение x неверно на первом 7 в его десятичном расширении; Я считаю 16 правильных цифр до этого. std::setprecision не контролирует точность входов до std::cout, он просто отображает столько цифр, сколько вы запрашиваете. Возможно, std::setprecision плохо назван, и его следует заменить на std::displayprecision, но std::setprecision выполняет свою работу. С лингвистической точки зрения подумайте о std::setprecision как о настройке точности std::cout и не пытайтесь контролировать точность аргументов до std::cout.

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