在C中以更高的精度存储数字

时间:2012-06-20 07:11:55

标签: c precision double-precision math.h

我正在编写一个程序,我需要以非常高的精度(大约10^-10)存储数字,然后进一步使用它们作为参数(create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem))。 我能够获得的最高精度是使用double10^-6左右)这是不够的。

我们如何在c?

中存储更高精度的数字?

3 个答案:

答案 0 :(得分:4)

您被误导double

您可以在double中存储的最小正数约为2⨯10 -308 ,不计算非规范化数字,可以更小。非正规数下降到5⨯10 -324 。它们相当于大约15-17位精度,足以测量地球的直径,使其达到人体最小细胞红细胞的大小。

如果你真的需要更高的精度,你需要MPFR。 (如果您的算法在数值上不稳定,则MPFR可能无效。)

编辑:我弄清楚你做错了什么。

在C中,10^-7是整数表达式。在大多数系统上它应该等于-13。 ^运算符是按位XOR运算符,指数运算符。 C中没有取幂运算符,因为C运算符通常对应于更原始的运算,至少在硬件实现方面。

您需要1e-7pow(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;
}

输出:

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

请注意,有很多浮点数的问题。

答案 1 :(得分:2)

尝试GNU MPFR libraryGNU GMP library

MPFR库是一个C库,用于具有正确舍入的多精度浮点计算。

GMP是一个免费的库,用于任意精度算术,对有符号整数,有理数和浮点数进行操作。精度没有实际限制,除了机器GMP中可用内存所暗示的那些限制。 GMP具有丰富的功能,并且功能具有常规接口。

答案 2 :(得分:0)

长双足够吗?一些实现使用128位长双精度,这应该可以轻松满足您的要求。

http://en.wikipedia.org/wiki/Quadruple_precision

如果您正在寻找极其强大的东西,请查看MPFR