指定起始索引以继续计算Pi

马克·萨瑟

此C#代码会将Pi计算为我指定的任何长度。我希望能够从给定索引开始,而无需重新计算到该点。精度不是一个大问题,因为这是一个难题项目,但我确实需要此代码来重复生成相同的结果。它可以正常工作,但我还无法弄清楚如何针对起点进行修改。

//Looking to pass BigInteger to specify a starting index for continuation of calculating Pi

    public static BigInteger GetPi(int digits, int iterations)
    {
        return 16 * ArcTan1OverX(5, digits).ElementAt(iterations)
            - 4 * ArcTan1OverX(239, digits).ElementAt(iterations);
    }

    public static IEnumerable<BigInteger> ArcTan1OverX(int x, int digits)
    {
        var mag = BigInteger.Pow(10, digits);
        var sum = BigInteger.Zero;
        bool sign = true;
        for (int i = 1; true; i += 2)
        {
            var cur = mag / (BigInteger.Pow(x, i) * i);
            if (sign)
            {
                sum += cur;
            }
            else
            {
                sum -= cur;
            }
            yield return sum;
            sign = !sign;
        }
    }
Xanatos

您正在将Machin公式与Arctan的Taylor扩展系列一起使用。对于每个“周期”,它应为您提供约1.4位数的精度(请参见此处)。您不能“简化”泰勒系列的计算。您可以稍微加快程序的速度,删除该IEnumerable<BigInteger>部分,然后简单地返回第n次迭代(该yield指令会产生成本),并通过BigInteger.Pow使用固定的乘法来更改但是计算仍将迭代进行。没有已知的方法可以在O(1)时间中以n位精度计算PI。

请注意,有一些算法(请参阅Wiki)以较少的周期收敛,但是我不确定它们是否以较少的操作收敛(它们的周期要复杂得多)。

代码的优化版本:

public static BigInteger GetPi2(int digits, int iterations)
{
    return 16 * ArcTan1OverX2(5, digits, iterations)
        - 4 * ArcTan1OverX2(239, digits, iterations);
}

public static BigInteger ArcTan1OverX2(int x, int digits, int iterations)
{
    var mag = BigInteger.Pow(10, digits);
    var sum = BigInteger.Zero;
    bool sign = true;

    int imax = 1 + (2 * iterations);

    int xsquared = x * x;
    BigInteger pow = x;

    for (int i = 1; i <= imax; i += 2)
    {
        if (i != 1)
        {
            pow *= xsquared;
        }

        var cur = mag / (pow * i);

        if (sign)
        {
            sum += cur;
        }
        else
        {
            sum -= cur;
        }

        sign = !sign;
    }

    return sum;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从指定的起始索引获取多个元素

来自分类Dev

根据新的帧速率计算帧索引以生成视频

来自分类Dev

根据新的帧速率计算帧索引以生成视频

来自分类Dev

指定 ItemBox 中选定数据的列索引以在迭代选定项时检索

来自分类Dev

为什么二进制搜索索引以这种方式计算?

来自分类Dev

在指定起始索引的字符串中查找子字符串的索引

来自分类Dev

在指定起始索引的字符串中查找子字符串的索引

来自分类Dev

熊猫TimerGrouper:索引以开头

来自分类Dev

整理索引以访问元素?

来自分类Dev

递归索引以取消列出矩阵

来自分类Dev

.map函数的索引以及内部方法

来自分类Dev

传递For循环索引以在For循环内运行

来自分类Dev

遍历jList索引以删除项目

来自分类Dev

创建索引以加快查询速度

来自分类Dev

无法获得正确的索引以返回

来自分类Dev

智能索引以匹配Julia中的值

来自分类Dev

单独的索引以进行选择优化

来自分类Dev

如何更改iterrows()的起始索引?

来自分类Dev

如何设置ObjectWriteStream的起始索引?

来自分类Dev

如何设置XAxis的起始索引?

来自分类Dev

计算多索引数据框中的比率(年份的起始值/上一年的结束值)

来自分类Dev

获取循环中的项目索引以与存储的索引匹配

来自分类Dev

组合的多列索引以及多个单列索引

来自分类Dev

Grails - 如何定义起始索引页 URL

来自分类Dev

使用size_t索引以相反顺序枚举数组

来自分类Dev

添加索引以查看字段是否为NULL

来自分类Dev

索引以查找不存在外键的记录

来自分类Dev

添加索引以加快Geocoder靠近搜索的速度

来自分类Dev

检查数组索引以避免出站异常

Related 相关文章

热门标签

归档