std :: pow вернет double для интегрального случая, и этот ответ здесь объясняет первый интеграл, где double не может более точно представлять каждый интеграл, начинающийся в 9007199254740993
после этого у нас могут быть целые числа, которые нельзя точно представить в виде двойного числа.
Мы можем увидеть это легче, используя тот факт, что сужающиеся преобразования плохо сформированы при равномерной инициализации. Используя результаты, которые вы хотите, мы видим, что:
double d2{1426567426713180361};
- это сужающееся преобразование ( живой крестик )
error: constant expression evaluates to 9007199254740993 which cannot be narrowed to type 'double' [-Wc++11-narrowing]
double d1{9007199254740993} ;
^~~~~~~~~~~~~~~~
, поскольку он не может быть точно представлен. Мы также можем видеть число из ранее также является сужением конверсии:
double d1{9007199254740993} ;
в то время как:
double d3{1426567426713180416};
нет.