steven.wang
steven.wang

Reputation: 3

How to set the level of precision for the decimal expansion of a rational number

I'm trying to print out the decimal expansion of a rational number in C. The problem I have is that when I divide the numerator by the denominator I lose precision. C rounds up the repeating part when I don't want it to.

For example, 1562/4995 = 0.3127127127... but in my program I get 1562/4995 = 0.312713. As you can see a part of the number that I need has been lost.

Is there a way to specify C to preserve a higher level of decimal precision?

I have tried to declare the result as a double, long double and float. I also tried to split the expansion into 2 integers seperated by a '.'

However both methods haven't been successful.

int main() {
    int numerator, denominator;
    numerator = 1562;
    denominator = 4995;

    double result; 
    result = (double) numerator / (double) denominator;
    printf("%f\n", result);

    return 0;
}

I expected the output to be 1562/4995 = 0.3127127127... but the actual output is 1562/4995 = 0.312713

Upvotes: 0

Views: 238

Answers (3)

Eric Postpischil
Eric Postpischil

Reputation: 223814

If printing is all you want to do, you can do this with the same long division you were taught in elementary school:

#include <stdio.h>


/*  Print the decimal representation of N/D with up to
    P digits after the decimal point.
*/
#define P   60
static void PrintDecimal(unsigned N, unsigned D)
{
    //  Print the integer portion.
    printf("%u.", N/D);

    //  Take the remainder.
    N %= D;

    for (int i = 0; i < P && N; ++i)
    {
        //  Move to next digit position and print next digit.
        N *= 10;
        printf("%u", N/D);

        //  Take the remainder.
        N %= D;
    }
}


int main(void)
{
    PrintDecimal(1562, 4995);
    putchar('\n');
}

Upvotes: 0

Adrian Mole
Adrian Mole

Reputation: 51894

You need to change your output format, like this:

printf("%.10lf\n", result);

Note two things:

  1. The value after the . specifies the decimal precision required (10 decimal places, here).
  2. Note that I have added an l before the f to explicitly state that the argument is a double rather than a (single-precision) float.

EDIT: Note that, for the printf function, it is not strictly necessary to include the l modifier. However, when you come to use the 'corresponding' scanf function for input, it's absence will generate a warning and (probably) undefined behaviour:

scanf("%f", &result); // Not correct
scanf("%lf", &result); // Correct

Upvotes: 0

dbush
dbush

Reputation: 224941

The %f format specifier to printf shows 6 digits after the decimal point by default. If you want to show more digits, use a precision specifier:

 printf("%.10f\n", result);

Also, the double type can only accurately store roughly 16 decimal digits of precision.

Upvotes: 2

Related Questions