Storing numbers with higher precision in C

c, double-precision, math.h, precision

Solution

You have been misinformed about `double`.

The smallest positive number you can store in a `double` is about 2⨯10-308, not counting denormalized numbers, which can be smaller. Denormals go down to 5⨯10-324. They have the equivalent of about 15-17 digits of precision, which is sufficient to measure the diameter of the Earth to within the size of a red blood cell, the smallest cell in the human body.

If you really need more precision, you need MPFR. (If your algorithms are numerically unstable, MPFR might not help.)

Edit: I figured out what you are doing wrong.

In C, `10^-7` is an integer expression. It should be equal to -13 on most systems. The `^` operator is the bitwise XOR operator, not the exponentiation operator. There is no exponentiation operator in C, because C operators generally correspond to more primitive operations, at least in terms of hardware implementation.

You want `1e-7`, or `pow(10, -7)`.

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
    printf("2e-308 = %g\n", 2e-308);
    printf("2 * pow(10, -308) = %g\n", 2 * pow(10, -308));
    printf("10^-7 = %d\n", 10^-7);
    return 0;
}

Output:

2e-308 = 2e-308
2 * pow(10, -308) = 2e-308
10^-7 = -13

Note that there are a lot of gotchas with floating point numbers.

Problem

I am writing a program in which I need to store numbers with a very high precision(around `10^-10`) and then further use them a parameter( `create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)` ). The highest precision I am able to get is with `double` (something around `10^-6`) which is not sufficient. How can we store numbers with more higher precision in c?

Original source