std::stod
выдает исключение std::out_of_range
, если значение, которое оно проанализировало из строки, выходит за пределы диапазона значений, которые может содержать double
.
Наибольшее значение, которое типичная реализация double
может содержать около 300 цифр. Ваш номер больше этого.
Поэтому выдается исключение, и потому что вы его не перехватываете, вызывается std::terminate
, который по умолчанию вызывает std::abort
, завершая программу.
Вы не можете хранить такое большое число в double
. Вместо этого вы можете попробовать std::stold
, который попытается проанализировать число как long double
, которое может быть больше double
, а может удерживать ваше значение.
Кроме того, в общем случае значения с плавающей точкой не могут представлять целые числа точно . Поэтому бессмысленно делать операцию по модулю double
или long double
, как вы делаете. Он не даст точного результата, а для очень больших значений по существу сгенерирует случайные значения.
Если вы хотите сделать точное значение по модулю для такого большого целого числа, вам нужна целочисленная библиотека произвольного размера или вы должны реализовать Операция по модулю самостоятельно.