I have a prime number calculator program that uses type casting. The type casting occurs in my "prime_calculator" function, under "Discard remaining composite numbers".

If I run it without type casting it, I get an error msg "conversion from double to unsigned long; possible loss of data".

I was just wondering where/what is the "double"?

mw

Code:`#include<stdio.h>`

#include<stdlib.h>

#include<math.h>

#include<malloc.h>

/*

This program calculates prime numbers using the Eratosthenes Sieve algorithm. It will find the prime numbers between 2 & "max". It overwrites the prime numbers to the file "prime_numbers.txt"

in the same folder.

Definitions:

1) Prime Number: a number with only 2 divisibles (itself & 1); the number "1" is not considered a prime number in this program

2) Composite Number: a number with more than 2 divisibles

Variable key:

discard = this is used to calculate composite numbers

count = a variable I use to count with

prime[max] = a pointer array that stores all of the numbers in the "max" range

max = the maximum range of prime numbers to calculate

highest = input from the user that is passed to "max"

An in-depth explanation of the Eratosthenes Sieve can be found on the internet.

*/

//prototypes

void start (void);

void prime_calculator (unsigned long max);

int main (void)

{

start ();

return 0;

}

void start (void)

{

unsigned long highest;

do

{

//input from user

printf ("\nType '0' to quit.");

printf ("\n\nPlease specify a max range to calculate prime numbers (up to 9000011).\n");

scanf ("%d", &highest);

//check input from user

if (highest < 0 || highest == 1 || highest > 9000011)

{

printf ("\n(Setting max range to 100)\n\n");

highest = 100;

}

//if user doesn't enter zero, call prime_calculator

if (highest != 0)

{

prime_calculator (highest);

}

} while (highest != 0);

}

void prime_calculator (unsigned long max)

{

unsigned long discard;

unsigned long count;

//Open & overwrite file for output

FILE *fp = fopen ("prime_numbers.txt", "w");

//Initialize the array

int *prime = malloc ((max+1)*sizeof(*prime));

if (!prime)

{

puts ("\n\nERROR! Not enough Memory!\n\n");

exit (1);

}

//initialize prime[max]

for (count = 0; count <= max; count++)

{

prime[count] = 1;

}

count = 0;

printf ("\nFinished initializing array.");

//Discard even composite numbers

for (discard = 4; discard <= max; discard = discard + 2)

{

prime[discard] = 0;

}

discard = 0;

printf ("\n\nFinished even discards.");

//Discard remaining composite numbers

count = 3;

do

{

for (discard = (int) pow(count,2); discard <= max; discard = discard + count * 2)

{

if (prime[discard] > 0)

{

prime[discard] = 0;

}

}

count++;

} while (pow(count,2) <= max);

count = 0;

discard = 0;

printf ("\n\nFinished all other discards.");

//Output

printf ("\n\nPrime Numbers between 2 and %d...\n", max);

for (count = 2; count <= max; count++)

{

if (prime[count] == 1)

{

printf ("%d ", count);

fprintf (fp,"\t%d", count);

}

}

count = 0;

fclose (fp);

free (prime);

printf ("\n\n");

}