Я хочу прерваться, когда вывод выдаст мне первый экземпляр: inf
Просто протестируйте INFINITY
из <math.h>
.Вывод не будет точным числом Фибоначчи .
#include <math.h>
#include <stdio.h>
int main(void) {
double a;
double b = 0;
double c = 1;
do {
a = b;
b = c;
c = a + b;
} while (c < INFINITY);
printf("%e\n", b);
return 0;
}
Выводом
1.306989e+308
long double
Используйте самый широкий тип с плавающей точкой и ищите неточное сложение.
#include <fenv.h>
#include <stdio.h>
int main(void) {
long double a;
long double b = 0;
long double c = 1;
do {
a = b;
b = c;
c = a + b;
} while (fetestexcept(FE_INEXACT) == 0);
printf("%.0Lf\n", b);
return 0;
}
Вывод
12200160415121876738
Целые числа
Используйте самый широкий доступный тип.Это похоже на @Syed.Waris unsigned long long
подход.Хотя обычно unsigned long long
и uintmax_t
имеют одинаковый диапазон, использование uintmax_t
обеспечивает самый широкий диапазон.
uintmax_t
: следующий тип обозначает целочисленный тип без знака, способный представлять любое значениелюбой тип целого числа без знака:
#include <stdint.h>
#include <stdio.h>
uintmax_t a;
uintmax_t b = 0;
uintmax_t c = 1;
do {
a = b;
b = c;
c = a + b;
} while(c >= b);
printf("%ju\n", b);
Выход
12200160415121876738
Строка
Альтернатива double
или некоторые int
type, это создать простую строку добавить функцию str_add () , тогда довольно просто сформировать большие числа Фибоначчи.
int main(void) {
char fib[3][4000];
strcpy(fib[0], "0");
strcpy(fib[1], "1");
int i;
for (i = 2; i <= 17127 && strlen(fib[1]) < sizeof fib[1] - 1; i++) {
printf("Fib(%3d) %s.\n", i, str_add(fib[2], fib[1], fib[0]));
strcpy(fib[0], fib[1]);
strcpy(fib[1], fib[2]);
}
printf("%zu\n", strlen(fib[2]));
return 0;
}
Вывод
Fib(1476) 13069...(299 digits)....71632. // Exact max `double`
Fib(17127) 95902...(3569 digits)...90818.