Storing numbers with higher precision in C

后端 未结 3 1486
[愿得一人]
[愿得一人] 2021-01-20 20:49

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_bloomfilte

3条回答
  •  温柔的废话
    2021-01-20 21:30

    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 
    #include 
    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.

提交回复
热议问题