Ничего не происходит. Двойные числа имеют конечную степень точности, и для этой точности полученное вами значение является правильным. Вызывает сожаление тот способ, которым вы выбрали для печати значения, что информация о точности (то есть значащие цифры) была потеряна.
Например, для числа с плавающей запятой 1 + 11 + (1) +52 ( см. Здесь ) у нас есть 53 бита точности, что дает нам 53 & times; log 10 2 цифры точности, то есть 15. Таким образом, мы печатаем только 15 цифр:
#include <iomanip>
#include <iostream>
std::cout << std::setfill('0') << std::setprecision(15) << std::scientific
<< Z << std::endl;
Результат:
2.469135797530864e+16
Теперь мы сделали манифест точности, и результат действительно верен с такой точностью.
Если вам не нравится магия 15
в коде, вы должны #include <limits>
и использовать:
std::numeric_limits<decltype(Z)>::digits10