Обратный расчет конверта: 25! чуть больше 10 25 ; три порядка - это примерно 10 бит, так что вам потребуется примерно 83 бита мантиссы, даже для точного представления результата.
Учитывая, что long double
на платформах, которые его поддерживают, обычно составляет 80 бит для всего значения (не только мантиссы!), Очевидно, у вас нет мантиссы, достаточной для выполнения этих вычислений такого порядка с целочисленной точностью.
Однако : факториал здесь немного волшебен, так как многие из факторов содержат степени двойки, которые просто добавляют двоичные нули справа, которые не требуют мантиссы (они заканчиваются в показателе степени) , В частности:
25! = 2 4 2 8 2 4 2 16 2 4 2 8 = 2²² · m
3 5 3 7 9 5 11 3 13 7 15 17 9 19 5 21 11 23 3 25
(m - произведение всех не-2 факторов, а именно m = 3 10 · 5 6 · 7 3 · 11 2 · 13 · 17 · 19 · 23, поэтому данные, которые мы должны хранить в мантиссе)
Следовательно, наша первоначальная оценка превышает фактические требования на 22 бита.
Оказывается,
log 2 (f) = 10 · log 2 3 + 6 · log 2 5 + 3 · log 2 7 + 2 · журнал 2 11 + журнал 2 13 + журнал 2 17 + журнал 2 19 + журнал 2 23 = 61,68
что на самом деле чуть меньше размера мантиссы 80-битной двойной (64-битной) длины. Но когда вы умножаете его на 26 (то есть, исключая множитель 2, который заканчивается в показателе степени на 13), вы добавляете log2 (13) = 3,7 бита. 61,7 + 3,7 - это 65,4, поэтому с 26 далее у вас больше нет точности, чтобы точно выполнить расчет.