2
cpp_dec_float_100 x = 0.00000000000001;  
cpp_dec_float_100 z = 0.00000000000008;  
cpp_dec_float_100 y = 0.1;  
cout << setprecision(100) << x +z + y; 

//0.100000000000090005551115123125676439960068731336843652116562475296035472638322971761226654052734375
cpp_dec_float_100 x = (cpp_dec_float_100)"0.00000000000001"; 
cpp_dec_float_100 z = (cpp_dec_float_100)"0.00000000000008"; 
cpp_dec_float_100 y = (cpp_dec_float_100)"0.1"; 
cout << setprecision(100) << x +z + y;

//0.10000000000009

Почему первый вариант записи кода дает неверный ответ?

  • 6
    Во втором случае функции класса cpp_dec_float_100 посимвольно анализируют строковые литералы и формируют корректные значения. А в первом случае преобразованию подвергаются литералы с плавающей точкой типа double. Т.к. вещественные числа 0.00000000000001 и 0.1 типом double формата IEEE 754 не представимы точно (пример), то получаем неверный ответ. – wololo Jan 30 '23 at 16:43
  • @wololo, оформьте, пожалуйста, ответом. – Герман Борисов Jan 31 '23 at 09:01

0 Answers0