C#验证拉马努金圆周率公式

拉马努金圆周率

1914年,印度天才数学家斯里尼瓦瑟·拉马努金在他的论文里发表了一系列共14条圆周率的计算公式。

这个公式每计算一项可以得到8位的十进制精度。

Ramanujan圆周率

当K=0时 π=9801/(1103*sqrt(8))

新建控制台应用程序RamanujanPi

示例程序:

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
 * 拉马努金圆周率公式 Ramanujan Pi
 * ​
1914年,印度天才数学家【斯里尼瓦瑟·拉马努金】在他的论文里发表了一系列共14条圆周率的计算公式。
这个公式每计算一项可以得到8位的十进制精度。​
因double类型小数点后最多14位精度,实际计算出来有一定误差
*/

namespace RamanujanPi
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int k = 0; k < 8; k++)
            {
                CalculatePi(k);
            }
            Console.ReadLine();
        }

        /// <summary>
        /// 计算圆周率
        /// </summary>
        /// <param name="k"></param>
        /// <returns></returns>
        static void CalculatePi(int k) 
        {
            double addition = CalculateOneItem(0);
            for (int i = 1; i <= k; i++)
            {
                addition += CalculateOneItem(k);
            }
            //计算出反比例1/π
            double inverseProportion = Math.Sqrt(8) / 9801 * addition;
            double pi = 1 / inverseProportion;
            Console.WriteLine($"【k={k}】时,拉马努金圆周率为【{pi}】,初步计算的反比例为【{inverseProportion}】");
        }

        /// <summary>
        /// 计算拉马努金圆周率的某一个项
        /// </summary>
        /// <param name="k"></param>
        /// <returns></returns>
        static double CalculateOneItem(int k) 
        {
            if (k < 0) 
            {
                throw new ArgumentException("参数k必须为自然数,【0,1,2,3,...】");
            }
            if (k == 0) 
            {
                return 1103;
            }
            return Factorial(4 * k) * (1103 + 26390 * k) / (Math.Pow(Factorial(k), 4) * Math.Pow(396, 4 * k));
        }

        /// <summary>
        /// 阶乘:数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!
        /// </summary>
        /// <param name="k">正整数</param>
        /// <returns></returns>
        static long Factorial(int k) 
        {
            if (k <= 0) 
            {
                return 1;
            }
            long factorial = 1;
            for (int i = 1; i <= k; i++)
            {
                factorial = factorial * i;
            }
            return factorial;
        }
    }
}

运行如图:

相关推荐
周杰伦fans10 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
samble12 小时前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
流形填表15 小时前
题库去重实战:基于题干指纹的重复题清理
开发语言·c#
开开心心就好21 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
QQ_216962909621 小时前
基于C#(Asp.net)电竞陪玩信息管理系统的设计与实现
java·大数据·spring boot·微信小程序·c#·云计算·asp.net
未来之窗软件服务1 天前
C# 截图源码支持自动保存-东方仙盟
c#·仙盟创梦ide·东方仙盟·电脑工具
UIU1142 天前
-7 / 2 在 C 里是 -3,在 Python 里是 -4,谁算错了?
c++·学习·c#
wflynn2 天前
GitHub 今日推荐|REDox:64 位 token 表示结构化数据,内存占用降 70% 支持多格式互转
开源·c#·github
驰骋工作流2 天前
C#/.NET 开源BPM工作流引擎6大常用对比选型分析驰骋BPM驰骋低代码低代码工作流引擎
开源·c#·.net
en.en..2 天前
C语言 fp与fd 区别详解
c#