首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成pi到n位的java

生成pi到n位的java
EN

Stack Overflow用户
提问于 2011-12-03 19:21:26
回答 3查看 16.4K关注 0票数 9

我想知道如何生成π到第n位数字。我有几个基本想法。

  1. 使用Math.PI并提高精度(如果可能的话)
  2. 使用欧拉公式生成pi,但即使在这里,我也需要提高精度(我认为)

  1. 还有Srinivasa Ramanujan生成PI的公式,它以它的快速收敛而闻名。这一方案似乎难以实施。我相信,我还得提高这里的神迹精度。

总之,不管是哪种情况,我都需要提高BigDecimal的精度,这取决于第n位数字是什么。如何将BigDecimal的精度提高到第9位呢?此外,如果有一个更好和更快的这样做,请您指出我的正确方向。

编辑:我只想生成PI。我不想用它来计算。这是一个关于如何使用BigDecimal来实现我的PI生成思想的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-03 19:27:05

  • Math.PIdouble型的。这意味着大约15位小数位的精度,这就是你拥有的所有数据;没有什么能神奇地使PI的额外数字出现。
  • BigDecimal具有任意精度。setScale()允许您以所需的精度创建BigDecimal对象,而且大多数算术方法都会根据需要自动提高精度,但当然,精度越高,所有计算都会越慢。
  • 具有讽刺意味的是,实现Ramanujan公式的最困难部分是常量因子中的sqrt(2),因为BigDecimal没有内置sqrt(),因此您必须编写自己的sqrt(2)。
票数 7
EN

Stack Overflow用户

发布于 2011-12-03 21:34:18

您需要使用MathContext来提高BigDecimal的精度

例如:

代码语言:javascript
运行
复制
MathContext mc = new MathContext(1000);
BigDecimal TWO = new BigDecimal(2, mc);

重要的是,您在计算中使用的所有BigDecimal都使用该MathContext。Heron的方法应该给你1000位的精度,只有10次迭代,一百万位数有20次迭代,所以它当然足够好了。另外,创建所有常量的BigDecimal,例如,在程序开始时只创建一次26390

票数 4
EN

Stack Overflow用户

发布于 2013-07-27 14:43:37

您可以使用以下代码

代码语言:javascript
运行
复制
import java.math.BigDecimal;
import java.math.RoundingMode;

public final class Pi {

private static final BigDecimal TWO = new BigDecimal("2");
private static final BigDecimal FOUR = new BigDecimal("4");
private static final BigDecimal FIVE = new BigDecimal("5");
private static final BigDecimal TWO_THIRTY_NINE = new BigDecimal("239");

private Pi() {}

public static BigDecimal pi(int numDigits) {

  int calcDigits = numDigits + 10;

  return FOUR.multiply((FOUR.multiply(arccot(FIVE, calcDigits)))
    .subtract(arccot(TWO_THIRTY_NINE, calcDigits)))
    .setScale(numDigits, RoundingMode.DOWN);
}

 private static BigDecimal arccot(BigDecimal x, int numDigits) {

BigDecimal unity = BigDecimal.ONE.setScale(numDigits,
  RoundingMode.DOWN);
BigDecimal sum = unity.divide(x, RoundingMode.DOWN);
BigDecimal xpower = new BigDecimal(sum.toString());
BigDecimal term = null;

boolean add = false;

for (BigDecimal n = new BigDecimal("3"); term == null ||
  term.compareTo(BigDecimal.ZERO) != 0; n = n.add(TWO)) {

  xpower = xpower.divide(x.pow(2), RoundingMode.DOWN);
  term = xpower.divide(n, RoundingMode.DOWN);
  sum = add ? sum.add(term) : sum.subtract(term);
  add = ! add;
}
return sum;
}
}

资源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8370290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档