我写一个程序,我需要存储的数字具有非常高的精度(约10^-10
),然后再使用这些参数( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)
我能够获得最高的精度与double
(周围的东西10^-6
),这是不够的。
我们如何存储在C更高精度的数字?
我写一个程序,我需要存储的数字具有非常高的精度(约10^-10
),然后再使用这些参数( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem)
我能够获得最高的精度与double
(周围的东西10^-6
),这是不够的。
我们如何存储在C更高精度的数字?
你一直在误导约double
。
你可以在一个存储的最小正数double
约为2⨯10-308,这还不包括非正规数,它可以更小。 非正规数再往5⨯10-324。 他们有一个约15-17位的精度,这足以对地球的直径测量的红血细胞,在人体中最小的细胞的尺寸范围内的等价物。
如果你真的需要更精确,你需要MPFR。 (如果你的算法是数值不稳定,MPFR可能不会帮助。)
编辑:我想通了,你在做什么错。
在C中, 10^-7
是整数表达式。 它应该等于-13在大多数系统上。 该^
运算符是按位异或运算符,而不是幂运算符。 在C中没有幂运算符,因为C运营商一般对应于更基本的操作,至少在硬件实现方面。
你想1e-7
或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;
}
输出:
2e-308 = 2e-308 2 * pow(10, -308) = 2e-308 10^-7 = -13
需要注意的是有很多陷阱的浮点数。
尝试GNU MPFR库和GNU GMP库
所述MPFR库是一个C库用于与正确的舍入多精度浮点计算。
GMP是高精度计算一个免费的图书馆,上有符号整数,有理数操作,和浮点数。 没有实际的限制除非在机器的可用内存GMP运行于隐含的那些精度。 GMP具有丰富的功能集和功能有一个普通接口。
长一倍,足够了吗? 一些应用程序采用128bit的长双,这应该很容易处理您的要求。
http://en.wikipedia.org/wiki/Quadruple_precision
如果你正在寻找的东西极强,退房MPFR