在C更高的精度存储号码(Storing numbers with higher precision

2019-09-18 07:31发布

我写一个程序,我需要存储的数字具有非常高的精度(约10^-10 ),然后再使用这些参数( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)
我能够获得最高的精度与double (周围的东西10^-6 ),这是不够的。

我们如何存储在C更高精度的数字?

Answer 1:

你一直在误导约double

你可以在一个存储的最小正数double约为2⨯10-308,这还不包括非正规数,它可以更小。 非正规数再往5⨯10-324。 他们有一个约15-17位的精度,这足以对地球的直径测量的红血细胞,在人体中最小的细胞的尺寸范围内的等价物。

如果你真的需要更精确,你需要MPFR。 (如果你的算法是数值不稳定,MPFR可能不会帮助。)

编辑:我想通了,你在做什么错。

在C中, 10^-7是整数表达式。 它应该等于-13在大多数系统上。 该^运算符是按位异或运算符,而不是幂运算符。 在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

需要注意的是有很多陷阱的浮点数。



Answer 2:

尝试GNU MPFR库和GNU GMP库

所述MPFR库是一个C库用于与正确的舍入多精度浮点计算。

GMP是高精度计算一个免费的图书馆,上有符号整数,有理数操作,和浮点数。 没有实际的限制除非在机器的可用内存GMP运行于隐含的那些精度。 GMP具有丰富的功能集和功能有一个普通接口。



Answer 3:

长一倍,足够了吗? 一些应用程序采用128bit的长双,这应该很容易处理您的要求。

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

如果你正在寻找的东西极强,退房MPFR



文章来源: Storing numbers with higher precision in C