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
Почему первый вариант записи кода дает неверный ответ?
cpp_dec_float_100посимвольно анализируют строковые литералы и формируют корректные значения. А в первом случае преобразованию подвергаются литералы с плавающей точкой типаdouble. Т.к. вещественные числа0.00000000000001и0.1типомdoubleформата IEEE 754 не представимы точно (пример), то получаем неверный ответ. – wololo Jan 30 '23 at 16:43