在 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 <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
    printf("2e-308 = %gn", 2e-308);
    printf("2 * pow(10, -308) = %gn", 2 * pow(10, -308));
    printf("10^-7 = %dn", 10^-7);
    return 0;
}

输出:

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

请注意,有很多带有浮点数的陷阱。

尝试 GNU MPFR 库和 GNU GMP 库

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

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

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

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

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

最新更新