# Problem with code

• 08-12-2002
brian0918
Problem with code
The problem with my code arises when I try putting in a value for quadmin and quadmax of around 60000. It starts saying all the results are negative numbers, though they can't be because of the numbers I'm using.

Code:

```                        short a;                         short bc;                         short cc;                         unsigned short iterations;                         cout << " " << endl;                         cout << " " << endl;                         cout << "----------------------------------------------" << endl;                         cout << " " << endl;                         cout << " " << endl;                         cout << "How many quadratics? (from n=min to n=max)" << endl;                         cout << "min?" << endl;                         cin >> quadmin;                         cout << "max?" << endl;                         cin >> quadmax;                         cout << "How many iterations? (from 0 to 65,535)" << endl;                         cin >> iterations;                         cout << "a?" << endl;                         cin >> a;                         cout << "b c?" << endl;                         cin >> bc;                         cout << "c c?" << endl;                         cin >> cc;                         cout << " " << endl;                         cout << " " << endl;                         cout << "-----------------------------------------" << endl;                         cout << " " << endl;                         cout << " " << endl;                                                         for(n = quadmin; n <= quadmax; n++)                         {                                 //keeps track of how many primes result for this quadratic                                 int primes = 0;                                        //keeps track of the total iterations for this quadratic                                 int total = 0;                                                                        //START of test for increasing values of i                                 for(unsigned short i=0;i<iterations;i++)                                 {                                                         short flag = 0;                                         __int64 num = ((a*i*i) + (((2*a*n)+bc)*i) + ((a*n*n)+(bc*n)+cc));                                                                                                 if(num>1)                                         {                                                 if((num%2)==0)        //checks against 2                                                 {                                                                        flag = 1;                                                 }                                                                 else                                                 {                                                         // checks odds from 3 up to sqrt(n)                                                         for(long m = 3;m<=((long)(sqrt(num)));m+=2)                                                                {                                                                                                        if((num%m)==0)                                                                 {                                                                                                                 flag = 1;                                                                         break;                                                                                         }                                                                 }                                                 }                                                                                 if(flag==0)                                                 {                                                         primes = primes + 1;                                                 }                                                 total++;                                         }                                         else                                         {                                                 long double r = num;                                                 cout << r << " was tossed out for being <= 1" << endl;                                                 cout << " " << endl;                                         }                                                 }                                                                                                         cout << a << "x^2 + " << ((2*a*n)+bc) << "x + " << ((a*n*n)+(bc*n)+cc) << endl;                                 cout << primes << " out of " << total << " were prime." << endl;                                 cout << " " << endl;                         }```

and here's the output (including the numbers I used)

Code:

```-------------------------------------------- How many quadratics? (from n=min to n=max) min? 60000 max? 70000 How many iterations? (from 0 to 65,535) 81 a? 1 b c? -1 c c? 41 ----------------------------------------- -6.95027e+008 was tossed out for being <= 1 -6.94907e+008 was tossed out for being <= 1 -6.94787e+008 was tossed out for being <= 1 -6.94667e+008 was tossed out for being <= 1 -6.94547e+008 was tossed out for being <= 1 -6.94427e+008 was tossed out for being <= 1 -6.94307e+008 was tossed out for being <= 1 -6.94187e+008 was tossed out for being <= 1 -6.94067e+008 was tossed out for being <= 1 -6.93947e+008 was tossed out for being <= 1```
• 08-12-2002
Salem

Because if they are short, as in your previous code, then you've wrapped your positive integers into negative
• 08-12-2002
brian0918
Oops, sorry I didn't include that part originally.

They are all longs.

long n;
• 08-12-2002
Salem
I'd change those other variables to be long as well

For instance
> (a*i*i)
This is evaluated as a short expression which suggests rounding and truncation is going on.

The expression only gets converted to __int64 when the assignment is made, and by then it's too late
• 08-12-2002
brian0918
Ok, I switched all shorts to long (except for the flag)... and it still doesn't work! The same result as before.

I even replaced:

__int64 num = ((a*i*i) + (((2*a*n)+bc)*i) + (anum + bnum + cnum))

with:

__int64 = (a*i*i);
__int64 = (((2*a*n)+bc)*i);
__int64 = ((a*n*n)+(bc*n)+cc);
__int64 num = (anum + bnum + cnum);

And it still didn't work. It keeps saying the current num is a negative, which is impossible. In my example, I go up to 80 in the iterations, and 70000 in the n... So, num is:

1*80*80 + (2*1*70000 - 1)*80 + ((1*70000*70000)+(-1*70000)+41)

which is 4,911,136,361

The range for __int64 is –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

If num was a "long", it would be expected to screw up due to overflowing numbers, but its much larger than a "long".. I don't get it! :(
• 08-12-2002
Salem
You've still got the same problem
1*70000*70000 does not fit into an unsigned long result

Try
( (__int64 )a*n*n )
which should force this part of the expression to be evaluated using __int64 arithmetic
• 08-12-2002
brian0918
WOOHOOO
Thanks! That did it! I had to basically put (__int64) in front of everything.

The final version was:

__int64 num = (((__int64)a*i*i) + (((__int64)((__int64)2*a*n)+bc)*i) + (((__int64)a*n*n)+((__int64)bc*n)+cc));