Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BBP算法得到PI的第n位?_C#_Algorithm_Math - Fatal编程技术网

C# BBP算法得到PI的第n位?

C# BBP算法得到PI的第n位?,c#,algorithm,math,C#,Algorithm,Math,我试图把它转换成C代码,它是以16为基数的π的数字提取(spiget算法),其思想是输入你想要的π的索引/小数位数,然后得到那个单个数字。假设我想要的是小数位数/索引40000(以16为基数)的数字,而不必用40000个小数计算pi,因为我不关心其他数字 不管怎样,这里是数学公式,(看起来不应该有太多代码?) 不能说我百分之百理解了形式的含义,如果我理解了,我可能能够将其转化为代码,但从我的理解来看 这是正确的吗? 伪代码 Pi=SUM=(对于int n=0;n

我试图把它转换成C代码,它是以16为基数的π的数字提取(spiget算法),其思想是输入你想要的π的索引/小数位数,然后得到那个单个数字。假设我想要的是小数位数/索引40000(以16为基数)的数字,而不必用40000个小数计算pi,因为我不关心其他数字

不管怎样,这里是数学公式,(看起来不应该有太多代码?)

不能说我百分之百理解了形式的含义,如果我理解了,我可能能够将其转化为代码,但从我的理解来看

这是正确的吗?

伪代码

Pi=SUM=(对于int n=0;n<无穷大;n++){SUM+=((4/((8*n)+1)) -(2/((8*n)+4))-(1/((8*n)+5))-(1/((8*n)+6))*((1/16)^n))}

大写西格玛基本上就像一个“for循环”来将序列相加? 例子

在C代码中:

static int-CapSigma(int-start,int-end)
{
整数和=0;

对于(int n=_start;n您需要转换为双精度:

    class Program
    {
        static void Main(string[] args)
        {
            double sum = 0;

            for (int i = 1; i < 100; i++)
            {
                sum += BBPpi(i);
                Console.WriteLine(sum.ToString());
            }
            Console.ReadLine();
        }
        static double BBPpi(int n)
        {
            double pi = ((16 ^ -n) * (4.0 / (8.0 * (double)n + 1.0) - 2 / (8.0 * (double)n + 4.0) - 1 / (8.0 * (double)n + 5.0) - 1.0 / (8.0 * (double)n + 6.0)));
            return (pi);
        }

    }
类程序
{
静态void Main(字符串[]参数)
{
双和=0;
对于(int i=1;i<100;i++)
{
总和+=BBPpi(i);
Console.WriteLine(sum.ToString());
}
Console.ReadLine();
}
静态双BBPpi(整数n)
{
双π=((16^-n)*(4.0/(8.0*(双)n+1.0)-2/(8.0*(双)n+4.0)-1/(8.0*(双)n+5.0)-1.0/(8.0*(双)n+6.0));
回报率(pi);
}
}

将该公式转换为工作算法需要理解所涉及的数学知识。不,您不能插入
n
的值并获取数字;必须先转换公式。有一些细节,但没有完整的工作算法;David Bailey(是的,公式的作者)有一些,这不难翻译成C#。
^
是C#中的异或,并且注意整数除法。我不确定这是什么意思,虽然它当然可以通过一个简单的循环转换成一个。这更像是一个随机存取算法,嗯?你不能在基于字符串的任意位置找到十进制数字由于要计算十进制数字n,需要除以10^n并取模10。10^n不是2的幂,因此答案将取决于该位置的大多数二进制数字。有关计算第n个十进制数字的信息,请参阅
static int BBPpi(int _precision)
{
    int pi = 0;
    for(int n = 0; n < _precision; n++)
    {
        pi += ((16 ^ -n) * (4 / (8 * n + 1) - 2 / (8 * n + 4) - 1 / (8 * n + 5) - 1 / (8 * n + 6)));
    }
    return (pi);
}
    class Program
    {
        static void Main(string[] args)
        {
            double sum = 0;

            for (int i = 1; i < 100; i++)
            {
                sum += BBPpi(i);
                Console.WriteLine(sum.ToString());
            }
            Console.ReadLine();
        }
        static double BBPpi(int n)
        {
            double pi = ((16 ^ -n) * (4.0 / (8.0 * (double)n + 1.0) - 2 / (8.0 * (double)n + 4.0) - 1 / (8.0 * (double)n + 5.0) - 1.0 / (8.0 * (double)n + 6.0)));
            return (pi);
        }

    }