【问题标题】:calculate decimal fraction and show digits after decimal in a precise manner [closed]以精确的方式计算小数并显示小数点后的数字[关闭]
【发布时间】:2013-03-05 05:06:49
【问题描述】:

给定一个分数(103993/33102),我需要找到这个分数的小数点后 50000 位。

最初我在 C++ 中使用setprecision(k),但它只给出了小数点后 17 位数字。我也试过了

sprintf (str, "%.500000f", num)

但结果是一样的。

我需要一个可以解决这个问题的算法,它不会对小数点后的数字进行四舍五入,即它应该是精确的。

【问题讨论】:

  • 你是认真的问我们怎么做长除法?!请告诉我你不是一个不知道如何做长除法的程序员。这是在四年级和五年级教的!试试这个math is fun 页面。我知道人们争论成为一名程序员需要多少更高的数学知识,但需要知道如何做基本的算术应该是没有争议的!
  • ...我说不出话了。
  • @DavidSchwartz:长除法到 50000 位很难,我怀疑大多数编码人员可以在没有库的情况下做到这一点。 (显而易见的答案是使用库)
  • @Mooing Duck 实际上不是 - 一旦您意识到您需要做的就是结转高位除法的余数,并存储/打印您计算的每个数字的结果。这不像你正在制作一个完整的大十进制库:)
  • @Patashu:对,我对 bignum/bignum 感到困惑,忘记了 bignum/int 很简单。他应该可以做长除法。

标签: c++ c decimal floating-point-precision


【解决方案1】:

解决此类问题的最佳方法是解决一个非常简单的问题,然后计算出算法。这样,您就不会感到困惑或失去自己的位置,并且无论问题如何,算法都是相同的。所以让我们选择4/3

  1. 4 进入 3 一次。我们还剩 1 个。我们输出 1. 为它输入的一次。我们保留剩下的 1。

  2. 我们将剩下的 1 乘以 10 得到 10。3(我们的分母)乘以 10 三次。还剩 1 个。

  3. 我们输出了3,因为它输入了 3 次。我们还剩下 1 个。

  4. 我们转到第 2 步并根据需要重复多次。

不管分子和分母是什么,只要它们是正整数,同样的算法就是这样工作的。

【讨论】:

    【解决方案2】:

    Float 或 double 不会这样做,因为它们不够精确。其他人建议使用 bignum 库。这可以做到,但还有另一种方法可以直接处理整数。

    一种称为模幂的技术可以用来解决这个问题。这使您可以计算所有数字而不会遇到精度问题。

    幸运的是,如何做到这一点的答案已经写好了:

    Getting a specific digit from a ratio expansion in any base (nth digit of x/y)

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多