Home > Software engineering >  Is there any way to not lose the precision and still get the value?
Is there any way to not lose the precision and still get the value?

Time:10-20

First off, I'm a total beginner at C, with prior experience of programming in Java and Python. The goal of the program was to add 2 numbers. While I was playing with the code, I encountered an issue with precision. The issue was caused when I added 2 numbers- 1 of float data type and the other of double data type.

Code:

#include <stdio.h>

int main() {
    double b=20.12345678;
    float c=30.1234f;
    printf("The Sum of %.8f and %.4f is= %.8f\n", b, c, b c);
    return 0;
}

Output:

The Sum of 20.12345678 and 30.1234 is= 50.24685651

However, the correct output should be: 50.24685678

float values are accurate up-to 6 decimal places, and so is the output. I tried casting the values explicitly to double type, but its still of no use.

PS: When I convert the variable type from float to double, the output is precise; but is there any other way to add float and double integers without messing with their data type? Thank You.

CodePudding user response:

The value assigned to c can't be expressed exactly so it gets assigned the next closest value. You don't see that when printing to 4 decimal places but you do see it if you print 8:

printf("The Sum of %.8f and %.8f is= %.8f\n", b, c, b c);

Output:

The Sum of 20.12345678 and 30.12339973 is= 50.24685651

So the constant 30.1234f is already imprecise enough for the calculation you're trying to do.

CodePudding user response:

float only guarantees 6 decimal digits of precision, so any computation with a float (even if the other operands are double, even if you're storing the result to a double) will only be precise to 6 digits.

If you need greater precision, then limit yourself to double or long double. If you need more than 10 decimal digits of precision, then you'll need to use something other than the native floating point types and library functions. You'll either need to roll your own, or use an arbitrary precision math library like GNU MP.

  • Related