I cannot determine why the Celsius values in this code are producing rubbish values. (Look at second statement in the first for-loop).


/* The program will output two columns with the temperature in degrees Fahrenhiet 
and equivalent temperature in degrees Celcius. The range will be 0 to 300 farenhiet in 
20 degree intervals. */

#include <stdio.h>

int main()

    double fahr[20], cel[20]; // there should be 16 values (300/20 + 1) in these arrays and a null zero. (total of 17 values)
                              // Doesn't hurt to make them a bit larger than necessary (i.e. 20 instead of 17 values)

    for (int i = 0; i < 16; i++)
            fahr[i] = i*20; // Express Farhrenhiet as a linear function of i and iterate 
            cel[i] = (5 / 9) * (fahr[i] - 32); // Express Celcius as a linear function of fahr[i]

    printf("Fahrenheit\tCelcius\n"); //printing the column headers 

    for (int j = 0; j < 16; j++)
        printf("%.f", fahr[j]);
        printf("\t\t%.2f", cel[j]);

    return 0;

The expression 5/9 (the second statement of first loop) will make an integer division, which will result in 0. You have to write 5.0/9 or 5/9.0 to get a double value as result.

  • $\begingroup$ Thank you. I didn't know that. Just to clarify the theory: Writing 5.0/9 or 5/9.0 (or even 5.0/9.0) ensures that I am diving by floating point values? And when ever I divide integers, I will get an integer value truncated? $\endgroup$ – Ryan J. Shrott Jun 10 '15 at 15:53
  • $\begingroup$ Exactly you can also write 5.0/9.0. Dividing numbers that are both integer will give to you only the division. E.g 18/5 will be 3 $\endgroup$ – atayenel Jun 10 '15 at 16:10

Not the answer you're looking for? Browse other questions tagged or ask your own question.