Как вычислить 37 десятичных знаков для Эйлера в C?
2 128 составляет около 3,4 * 10 38 . Формируя 128-битный целочисленный числитель / знаменатель, мы можем достичь желаемого e .
Переписав l oop, как показано ниже, и набрав достаточно большой n
до num*i + 1
вот-вот переполнится (n == 33), мы можем прийти к нужному результату или приблизиться к нему.
// Algorithm
wide_floating_point e() {
unsigned n = 33;
my_uint128 num = 1;
my_uint128 den = 1;
for (unsigned i=1; i <= n; i++) {
num = num*i + 1;
den = den*i;
}
return (wide_floating_point) num/fact;
}
Теперь OP, возможно, не имеет целочисленного типа без знака 128 и не может выполнить 128 / 128-битное деление с плавающей запятой. Тем не менее, OP нужно только создать 2 функции (реализации не показаны, но по сути это математика начальной школы):
typedef struct {
// or unsigned char decimal_digit[40] or
// however you want to save a big integer
uint64_t hi,lo;
} my_uint128;
my_uint128 times_add_128(my_uint128 x, unsigned m, bool a);
void print_quotient_128(my_uint128 num, my_uint128 dem);
Если мы проверяем алгоритм и используем __int128
и используем long double
( с точностью 80) мы приближаемся к цели.
long double e(int n) {
unsigned __int128 fact = 1;
unsigned __int128 num = 1;
for (int i=1; i<=n; i++) {
fact *= i;
if (num > (((unsigned __int128)-1)-1)/i) { printf("%d!\n", i); exit(0); }
num = num*i + 1;
}
return 1.0L*num/fact;
}
int main() {
for (int i=1; i<34; i++) {
printf("%d %.25Lf\n", i, e(i));
}
}
2,718281828459045235 3602874713526624977
33 2.718281828459045235 4281681
Я оставляю 2 функции times_add_128(), print_quotient_128()
для OP, чтобы кодировать: