我正在编写一个程序,我需要以非常高的精度(大约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
。
您可以存储在 a 中的最小正数double
约为 2⨯10 -308,不包括非规格化数,它可以更小。非正规下降到 5⨯10 -324。它们具有大约 15-17 位数的精度,足以将地球的直径测量到红细胞大小,这是人体中最小的细胞。
如果你真的需要更高的精度,你需要 MPFR。(如果您的算法在数值上不稳定,MPFR 可能无济于事。)
编辑:我知道你做错了什么。
在 C 中,10^-7
是一个整数表达式。在大多数系统上它应该等于 -13。该^
运算符是按位 XOR 运算符,而不是幂运算符。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
请注意,浮点数有很多陷阱。
MPFR 库是一个用于具有正确舍入的多精度浮点计算的 C 库。
GMP 是用于任意精度算术的免费库,可对有符号整数、有理数和浮点数进行操作。除了运行 GMP 的机器中的可用内存所暗示的精度外,对精度没有实际限制。GMP具有丰富的功能集,并且功能具有规则的接口。
长双足吗?一些实现使用 128 位长双精度,应该可以轻松满足您的要求。
http://en.wikipedia.org/wiki/Quadruple_precision
如果您正在寻找非常强大的东西,请查看 MPFR