ОБНОВЛЕНИЕ:
Спасибо за полезные комментарии и советы.Используя то, что вы, ребята, сказали, вот что я придумал:
#include <limits.h>
...
else {
int a = binom(n - 1, k - 1);
int b = binom(n - 1, k);
if(a > 0) {
if (b > INT_MAX - a) { // case 1: integer overflow
printf("int overflow\n");
return;
}
}
else if (b < INT_MIN - a) { // case 2: integer overflow
printf("int overflow\n");
return;
}
int c = a + b;
return c;
}
У меня есть еще один вопрос.В приведенном выше коде, когда я ловлю целочисленное переполнение, я не возвращаю значение - это просто return;
.
В одном из приведенных ниже комментариев предлагается return -1;
, однако это не сработает, учитывая, что -1 все еще является действительным целым числом, верно?
Я не уверен, что делать, поскольку тип возвращаемого значения int
для моей функции.return;
работает или есть лучший способ сделать это?Также было предложено exit(1);
, но это завершает всю программу или только функцию?
ORIGINAL:
Ваша функция должна использовать целочисленную арифметику, чтобы убедиться в точности результатов, а также обнаруживать любые целочисленные переполнения, вызванные превышениеммаксимально допустимые значения.
Я пытаюсь поймать целочисленное переполнение при вычислении биномиальных коэффициентов.Хотя простая концепция меня отталкивает, это то, что это не однократное дополнение, это рекурсивный алгоритм, который постоянно выполняет суммирование.
Это функция:
// recursive function to calculate binomial coefficients
int binom(int n, int k){
if(k == 0){ // base case
return 1;
}
else if (n == 0){
return 0;
}
else{
return binom(n - 1, k - 1) + binom(n - 1, k); // recursive call
}
}
В соответствии с этой логикой я предполагаю, что перехват должен быть в операторе рекурсивного вызова.Что-то вроде:
if(binom(n-1, k-1) + binom(n-1,k)) causes overflow, return error, else proceed with binom(n-1, k-1) + binom(n-1,k)