在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。 ^
运算符是按位XOR运算符, 而不是取幂运算符。 C中没有取幂运算符,因为C运算符通常对应于更原始的运算,至少在硬件实现方面如此。
你想要1e-7
,或者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; }
输出:
2e-308 = 2e-308 2 * pow(10,-308)= 2e-308 10 ^ -7 = -13
请注意,有很多浮点数的陷阱。
试试GNU MPFR库和GNU GMP库
MPFR库是一个C库,用于具有正确舍入的多精度浮点计算。
GMP是一个免费的库,用于任意精度算术,对有符号整数,有理数和浮点数进行操作。 精度没有实际限制,除了机器GMP中可用内存所隐含的那些。 GMP具有丰富的function,并且function具有常规接口。
长双足够吗? 一些实现使用128位长双精度,这应该可以轻松满足您的要求。
http://en.wikipedia.org/wiki/Quadruple_precision
如果您正在寻找非常强大的东西,请查看MPFR