【问题标题】:Storing numbers with higher precision in C在 C 中以更高的精度存储数字
【发布时间】:2012-06-20 07:11:54
【问题描述】:

我正在编写一个程序,我需要以非常高的精度存储数字(大约10^-10),然后进一步使用它们作为参数(create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem))。
我能得到的最高精度是double10^-6 附近的东西),这还不够。

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

【问题讨论】:

  • 重新定义你的 Q 表示你想存储 precision 的数字,只是说 small number 真的没有多大意义。
  • 您需要指定一个范围。此外,您希望如何处理接近零的孔、舍入等。
  • @DietrichEpp 我在我的系统上运行它,如果我输入 10^-7,它会打印 0 作为值,我使用的格式字符串是 %lf
  • 我为您编辑了 Q。检查这是否是您要问的内容,并在 斜体 中填写我为您保留的详细信息。
  • @AmanDeepGautam:这个数字的最大可能值是多少?由于浮点数的精度是在“位数”中定义的,而不是绝对值。

标签: c precision double-precision math.h


【解决方案1】:

你被误导了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

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

【讨论】:

  • 您能否举一个相同的例子以及如何使用printf进行打印
  • 我在我的程序中使用的语句是falsePositivity = 0.0000001,当用printf("%lf\n", false_positivity) 打印时给出0.000000 作为答案。
  • 问题出在%lf%lf 有两部分是错误的。首先,l 不属于那里(它用于整数)。其次,f 默认只打印出七位数字。您要么希望%g 用于任意小的数字,因此它将切换到科学计数法,或者您希望%.10f(或其他一些数字)提高%f 的精度。您也可以使用%e,它始终使用科学计数法。
【解决方案2】:

试试GNU MPFR libraryGNU GMP library

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

GMP 是用于任意精度算术的免费库,可对有符号整数、有理数和浮点数进行运算。除了运行 GMP 的机器中的可用内存所暗示的精度外,对精度没有实际限制。 GMP功能丰富,功能接口规范。

【讨论】:

    【解决方案3】:

    long double 是否足够?一些实现使用 128 位长双精度,应该可以轻松满足您的要求。

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

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

    【讨论】:

    • 在维基百科的文章中,还提到不能保证使用long double关键字可以得到四倍精度。
    猜你喜欢
    • 2015-06-05
    • 2012-03-03
    • 2011-07-25
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多