【问题标题】:Maximum decimal places in CC中的最大小数位数
【发布时间】:2018-08-24 10:05:01
【问题描述】:

我遇到了一个小问题。我正在尝试查找数字的倒数是否包含 C 中的数字。但是,我无法使用 float 或 double 打印小数点后 15 位以上的倒数。我怎样才能有尽可能多的小数位(比如超过 100++)?

解决方案:

char output[10000];
void divide(int a, int b, char *c, int d)
{
    if (d == 10000)
        return;
    int e = a/b;
    int f = (a%b)*10;
    if(d>=1)
        c[d+1] = e + '0';
    divide(f, b, c, d+1);
}

【问题讨论】:

  • IEEE 754 double 仅精确到大约 15 位数字。如果您想获得更高的精度,请使用long double,它在 x86 上精确到 19 位。如果你想有更多的数字,使用某种大整数库。
  • 您需要自己编写长数字或找到一个库来为您完成。如果你想自己做,你需要回忆一下像长除法这样的高中算法,并在代码中实现它们。

标签: c floating-point decimal


【解决方案1】:

格式化printf 不是这里的问题。它是数据类型。 C 中的浮点数使用 IEEE 754 编码。

这种类型的编码使用符号、有效数和指数。

由于这种编码方式,许多数字将进行微小的更改以允许它们被存储。此外,有效位数可能会略有变化,因为它是二进制表示,而不是十进制表示。

单精度 (float) 为您提供 23 位有效位、8 位指数和 1 位符号位。
双精度 (double) 为您提供 52 位有效数、11 位指数和 1 个符号位。

你可以存储在双精度数中的最小正数大约是 2⨯10-308,不包括非规格化数,它可以更小。它们具有大约 15-17 位数的精度,足以将地球的直径测量到人体最小细胞红细胞的大小。

因此,您需要一个大型数字库来处理您的问题。

我建议HPALIB,因为它是解决您问题的简单工具。请注意,这么大的数字会占用大量内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多