我在Pi的第n位使用BBP公式。正常的BBP公式为Pi的一定位数计算Pi。我正在尝试获得Pi的一位数字的值。 Wikipedia BBP公式网站上有关于如何获取Pi的第n位数字的部分。本部分是此link。因此,我用Java编写了一个程序,使用对BBP公式的解释来计算Pi的第n位数字,这就是这张图片:
这是我的Java程序的代码。如果我的公式或Java代码在计算Pi的n位数字时出错,请告诉我,因为我没有得到正确的答案。例如)
Which decimal digit of Pi do you want? 1 3.0024718637216376E116 C:\Users\matth\Documents>java NthDigitOfPi Which decimal digit of Pi do you want? 2 9.224189345124711E114
import java.io.Console;
public class NthDigitOfPi {
public static void main(String[] args) {
System.out.print("Which decimal digit of Pi do you want? ");
String line = System.console().readLine();
double n = Double.parseDouble(line);
double y = 0.0;
for (double k = 0; k <= n; k++) {
y = y + ((Math.pow(16, (n - k))) % (8 * k + 1)) / (8 * k + 1);
}
double z = 0;
for (double k = (n + 1); k <= 100; k++) {
z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 1));
}
y = y + z;
y = 4 * y;
double y2 = 0;
for (double k = 0; k <= n; k++) {
y2 = y2 + ((Math.pow(16, (n - k))) % (8 * k + 4)) / (8 * k + 4);
}
z = 0;
for (double k = (n + 1); k <= 100; k++) {
z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 4));
}
y2 = y2 + z;
y2 = 2 * y2;
y = y - y2;
double y3 = 0;
for (double k = 0; k <= n; k++) {
y3 = y3 + ((Math.pow(16, (n - k))) % (8 * k + 5)) / (8 * k + 5);
}
z = 0;
for (double k = (n + 1); k <= 100; k++) {
z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 5));
}
y3 = y3 + z;
y = y - y3;
double y4 = 0;
for (double k = 0; k <= n; k++) {
y4 = y4 + ((Math.pow(16, (n - k))) % (8 * k + 6)) / (8 * k + 6);
}
z = 0;
for (double k = (n + 1); k <= 100; k++) {
z = z + ((Math.pow(16, (100 - k))) / ((8 * k) + 1));
}
y4 = y4 + z;
y = y - y4;
System.out.print(y);
}
}
答案 0 :(得分:2)
这不是您问题的直接答案,也不是代码中问题的解决方案,但是在Java中用Pi获得nth
数字的一种实用方法是仅对字符串Math.PI
进行子处理:
public char nPi(int index) {
if (index < 0 || index > 15) return '';
String pi = String.valueOf(Math.PI).replace(".", "");
char nDigit = pi.charAt(index);
return nDigit;
}
注意:这会将PI限制在16位左右。但是,除非您要进行一些非常精确的数学运算,否则此选项可能对您有用。
答案 1 :(得分:0)
您需要结合使用@tim Biegeleisen的程序和此程序。首先,您需要计算所需的pi位数,因此请使用此线程中的信息:Calculating Pi Java Program
该公式不是“简单的”,因此我不会从线程中复制任何代码,您可以自己查看。
一旦使用了它们的计算方式,就使用
String pi = String.valueOf([picalcs]).replace(".", ""); char nDigit = pi.charAt(index);
,其中pi的计算包含在代码的[picalcs]的占位符中。
如果您所需要的位数超出了双精度数可以存储的位数,则需要创建一个数据存储系统。您可以“使用”一个数组来单独存储double的位值,每个位值都包含16位数字。但是您需要将彼此相减以获得更多的值。
例如,如果您的第一个索引存储:3.14159 26535 89793 然后使用第二个索引获取更多的pi值,然后从第一个索引中减去pi以获得下一个16个值:23846 26433 83279 5
这应该使您可以根据需要获取pi的位数。希望这会有所帮助,祝你好运。
答案 2 :(得分:0)
尝试此操作,其中值是用户输入的数字和指针 3.141592653589793115997963468544185161590576171875如果用户使用inter inter 1作为值 如果将用户inter 2作为值,则为6.28318530717958623199592693708837032318115234375
select CustomerId, PurchaseDate
From Orders
Where PurchaseDate between '08/01/18' and '08/31/18' --- can't be changed
or PurchaseDate between '07/01/18' and '07/31/18' ----