我用Java编写了一个快速程序,尝试使用整数分数找到Pi的近似值。然而,它似乎根本没有做我想要它做什么。事实上,它似乎什么都不做,只是重复打印出硬编码的起始值。
为了弄清楚出了什么问题,我把我的代码翻译成了Python,因为我只是学习Java而且对Python很熟悉。但是,由于某种原因,它完全按照我的意图工作。我现在必须阅读这两个版本的代码至少10次,我不明白为什么一个有效,另一个没有。
无论如何,这是我在Java中的代码:
public class RationalPi {
public static void main(String[] args) {
int arg;
if (args.length>0) { arg = Integer.parseInt(args[0]); }
else { arg = 10000; }
int numer = 3;
int denom = 1;
double pi = numer / denom;
for (int i=numer; i<=arg; i++) {
for (int j=i/4; j<=i/2; j++) {
if (j==0) { continue; }
double newPi = i / j;
if (Math.abs(newPi-Math.PI) < Math.abs(pi-Math.PI)) {
System.out.println("found better approximation");
numer = i;
denom = j;
pi = newPi;
}
}
System.out.println(String.format("%d /%2d == %f", numer, denom, pi));
}
}
}
这就是我认为应该是Python中功能相同的代码:
from math import pi as PI
def findApproximate(arg=10000):
numer, denom = 3, 1
pi = numer / denom
for i in range(numer, arg+1):
for j in range(int(i/4), int((i/2)+1)):
if not j:
continue
newPi = i / j
if abs(newPi-PI) < abs(pi-PI):
print("Found better approximation")
numer, denom, pi = i, j, newPi
print("%d / %d == " % (numer, denom) + str(pi))
return pi
但由于某种原因,这种方法很有效,而上述情况并非如此,而且它让我绝对疯狂。如果可以,请帮忙。
答案 0 :(得分:4)
此行分割整数,然后将(截断的)结果存储为双精度
double newPi = i / j;
如果你想要一个准确的结果,将其中一个变量加到双倍
double newPi = (double) i / j;
与
相同double pi = numer / denom;