1
The unsigned long int type stores a maximum value of 4294967295 (2 32 - 1) while the float value stores a maximum of 10 38.
I’m doing an overflow test on an unsigned variable long int. Look at the code below, please.
The function below is a recursive function that calculates the number of steps that a given number l eva to converge to 1 according to the Collatz conjecture. Basically I want to test is
#define max 4294967295
unsigned long int collatz(unsigned long int n, unsigned long int passos, unsigned long int *maiorN) {
float overflow = 3 * n + 1;
if (overflow > max)
return -1;
if (n == 1)
return passos;
else if (n % 2 == 0)
return collatz(n / 2, passos + 1, maiorN);
else {
if ((3 * n + 1) > *maiorN)
*maiorN = 3 * n + 1;
return collatz(3 * n + 1, passos + 1, maiorN);
}
}
Apparently this code is correct, at least from my point of view, but it seems to overflow earlier than expected.
Could someone take a look, please?
looking at the surface, I think where "float overflow = 3 * n + 1;" should be "float overflow = 3.0 * n + 1;" to avoid possible overflow in operations " 3 * n + 1", which are made in integer.
– zentrunix