gpt4 book ai didi

python - 尝试将 python 片段导入 C/C++(PI spigot 算法)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:34 27 4
gpt4 key购买 nike

前段时间(我不记得在哪里)我找到了这个 python 片段,它实现了一个用于计算 Pi 数字的 spigot 算法:

def pi_digits():
"""generator for digits of pi"""
q,r,t,k,n,l = 1,0,1,1,3,3
while True:
if 4*q+r-t < n*t:
yield n
q,r,t,k,n,l = (10*q,10*(r-n*t),t,k,(10*(3*q+r))/t-10*n,l)
else:
q,r,t,k,n,l = (q*k,(2*q+r)*l,t*l,k+1,(q*(7*k+2)+r*l)/(t*l),l+2)

digits = pi_digits()
for i in range(30): print digits.next()

现在我想用 C++ 实现它。我的尝试是:

#include <cmath>
#include <cstdlib>
#include <iostream>

typedef long long ll;

void help() {
std::cout << "Usage: pi2 <digits>" << std::endl;
exit(1);
}

void pi(const long long digits) {
ll q, r, t, k, n, l;
q=1;
r=0;
t=1;
k=1;
n=3;
l=3;
for(ll i=0; i<digits; ++i) {
if(4*q+r-t < n*t) {
std::cout << n;
q=10*q;
r=10*(r-n*t);
n = ( 10 * ( 3 * q + r) / t ) - 10 * n; //Thanks to maverik
} else {
q=q*k;
r=(2*q+r)*l;
t=t*l;
k=k+1;
n=(q*(7*k+2)+r*l)/(t*l);
l=l+2;
}
}
}

int main(int argc, char** argv) {
if(argc<2) help();
ll digits = 0;
if(digits=atoll(argv[1])<1) help();
pi(digits);
return 0;
}

但它从不调用 std::cout::operator<<,而 python 版本有效。你能帮帮我吗?

谢谢。

最佳答案

原因是您的代码没有以两种语言执行等效的计算。

(据我所知)有两个原因:

  1. 在这段 python 代码中,所有的计算都是同时完成的:

    q,r,t,k,n,l = (q*k,(2*q+r)*l,t*l,k+1,(q*(7*k+2)+r*l)/(t*l),l+2)

    在 C 代码中,一次计算一次,因此每次都使用前一次计算的结果,而不是使用旧值(就像 python 代码那样)。

  2. 您在 Python 中使用 int,在 C 中使用 long long。C 代码中的除法将生成 long long,而 python 中的除法(假设是 python 2)将生成向下舍入的 int

    这也可能造成计算错误,导致您的条件永远不成立。

附言从头开始用 C 语言实现它可能比移植 Python 算法更好。

关于python - 尝试将 python 片段导入 C/C++(PI spigot 算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14003829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com