В C++ различные фундаментальные типы имеют фиксированные размеры. Например, long long
обычно имеет ширину 64 бит. Но ширина зависит от типа системы и других факторов. Как было предложено выше, вы можете проверить climits.h за пределы вашей конкретной среды.
Повышение 2 к власти 12345677 предполагает смещение двоичного числа 10
оставленного 12345676 бит, которые не помещаются в 64 битом long long
(и я подозреваю, что вряд ли уместится в большинстве long long
реализации).
Другим фактором, который следует учитывать, является то, что pow
возвращает double
(или long double
) depending on the overload used.Вы не говорите, какой компилятор вы используете, но, скорее всего, вы получили предупреждение о возможном усечении или потере данных, когда результат вызова pow
присваивается переменной long long
a
.
Наконец, даже если pow
возвращается длинный двойной Я подозреваю, что показатель 12345677 слишком велик, чтобы хранить в long double
так pow
, вероятно, возвращая положительную бесконечность, который затем получает усеченный до некоторой комбинации битов, которые будут соответствовать в long long
. Вы можете, конечно, проверить это, введя промежуточную переменную long double
, чтобы получить значение pow
, которое затем можно было бы проверить в отладчике.
Проверьте 'ULLONG_MAX', если' 749037894' будет помещаться в 'unsigned long long' на вашем компьютере и использовать этот тип. Если нет, вам нужно использовать библиотеку bigint для выполнения таких вычислений. –
Спасибо за ответ! Но, извините, я не понимаю. – rel1x
Что конкретно вы не поняли? 'ULLONG_MAX' - это наибольшее положительное целое число, которое вы можете представить в конкретной машинной архитектуре. –