Search code examples
cfloating-pointdouble

How do I print in double precision?


I'm completely new to C and I'm trying to complete an assignment. The exercise is to print tan(x) with x incrementing from 0 to pi/2.

We need to print this in float and double. I wrote a program that seems to work, but I only printed floats, while I expected double.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    double x;
    
    double pi;
    pi = M_PI;
     
    for (x = 0; x<=pi/2; x+= pi/20)
    {
        printf("x = %lf, tan = %lf\n",x, tan(x));
        
    }
    
    exit(0);
}

My question is:

  • Why do I get floats, while I defined the variables as double and used %lf in the printf function?

  • What do I need to change to get doubles as output?


Solution

  • Why do I get floats, while I defined the variables as double and used %lf in the printf function?

    Code is not getting "floats", output is simply text. Even if the argument coded is a float or a double, the output is the text translation of the floating point number - often rounded.

    printf() simply follows the behavior of "%lf": print a floating point value with 6 places after the decimal point. With printf(), "%lf" performs exactly like "%f".

    printf("%lf\n%lf\n%f\n%f\n", 123.45, 123.45f, 123.45, 123.45f);
    // 123.450000
    // 123.449997
    // 123.450000
    // 123.449997
    

    What do I need to change to get doubles as output?

    Nothing, the output is text, not double. To see more digits, print with greater precision.

    printf("%.50f\n%.25f\n", 123.45, 123.45f);
    // 123.45000000000000284217094304040074348449710000000000
    // 123.4499969482421875000000000
    

    how do I manipulate the code so that my output is in float notation?

    Try "%e", "%a" for exponential notation. For a better idea of how many digits to print: Printf width specifier to maintain precision of floating-point value.

    printf("%.50e\n%.25e\n", 123.45, 123.45f);
    printf("%a\n%a\n", 123.45, 123.45f);
    
    // 1.23450000000000002842170943040400743484497100000000e+02
    // 1.2344999694824218750000000e+02
    // 0x1.edccccccccccdp+6
    // 0x1.edccccp+6
    
    printf("%.*e\n%.*e\n", DBL_DECIMAL_DIG-1, 123.45, FLT_DECIMAL_DIG-1,123.45f);
    // 1.2345000000000000e+02
    // 1.23449997e+02