C# 中小数的任意精度有帮助吗?

发布于 2024-12-15 16:35:57 字数 2771 浏览 4 评论 0原文

以下是我当前使用 c# 中的 chudnovsky 方法计算 Pi 的代码:

using System;
using System.Diagnostics;
using System.IO;
using java.math;

namespace pi.chudnovsky
{
    public class Program
    {
        static Double Factorial(Double fact)
        {
            //begin factorial function
            if (fact <= 1)
                return 1;
            else
                return fact * Factorial(fact - 1); //loops multiplication until the factorial is reached
        }
        static Double doSummation(Double maxPower)
        {
            //begin chudnovsky summation function
            Double sum = 0;
            for (int i = 0; i <= maxPower; i++) //starts at i=0
            {
                sum += ((Math.Pow(-1, i)) * Factorial(6 * i) * (13591409 + 5451401 * i)) / (Factorial(3 * i) * Factorial(i) * Factorial(i) * Factorial(i) * Math.Pow(640320, (3 * i + 1.5))); //chudnovsky algorithm
            }
            return sum;
        }
        static void Main(string[] args)
        {
            int num;
            Console.WriteLine("Enter how many terms to compute Chudnovsky summation: ");
            //begin stopwatch
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //parse user input
            num = Convert.ToInt32(Console.ReadLine());
            //perform calculation
            Double inv = 1 / (12 * doSummation(num));
            //stop stopwatch
            stopwatch.Stop();
            //display info
            Console.WriteLine(inv);
            Console.WriteLine("3.14159265358979323846264338327950288419716939937510");
            Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed.TotalMilliseconds);
            //write to pi.txt
            TextWriter pi = new StreamWriter("pi.txt");
            pi.WriteLine(inv);
            pi.Close();
            //write to stats.txt
            TextWriter stats = new StreamWriter("stats.txt");
            stats.WriteLine(stopwatch.Elapsed.TotalMilliseconds);
            stats.Close();
        }
    }
}

因此,我包含了 J# 库,并包含了 java.math。现在,当我用“BigDecimal”替换所有“double”时,我收到以下编译错误:

http://f.cl.ly/items/1r2X26470d0d0n260p0p/Image%202011-11-14%20at%206.16.19%20PM.png

我知道这不是问题我使用 Int 进行循环,因为它与 Double 完美配合。我的问题是,您如何解决与 int 和 BigDecimal 相关的这些错误,或者您可以推荐另一个任意精度库吗?

我尝试过使用 XMPIR,已完成所有内容的编译,但我得到:

http://f.cl.ly/items/1l3C371j2u3z3n2g3a0j/Image%202011-11-14%20at%206.20.24%20PM.png

所以我可以使用 p/invoke 来包括 xmpir 这样我就可以使用 bigdecimal 类了?

谢谢您的宝贵时间!

Here is my current code for computing Pi using the chudnovsky method in c#:

using System;
using System.Diagnostics;
using System.IO;
using java.math;

namespace pi.chudnovsky
{
    public class Program
    {
        static Double Factorial(Double fact)
        {
            //begin factorial function
            if (fact <= 1)
                return 1;
            else
                return fact * Factorial(fact - 1); //loops multiplication until the factorial is reached
        }
        static Double doSummation(Double maxPower)
        {
            //begin chudnovsky summation function
            Double sum = 0;
            for (int i = 0; i <= maxPower; i++) //starts at i=0
            {
                sum += ((Math.Pow(-1, i)) * Factorial(6 * i) * (13591409 + 5451401 * i)) / (Factorial(3 * i) * Factorial(i) * Factorial(i) * Factorial(i) * Math.Pow(640320, (3 * i + 1.5))); //chudnovsky algorithm
            }
            return sum;
        }
        static void Main(string[] args)
        {
            int num;
            Console.WriteLine("Enter how many terms to compute Chudnovsky summation: ");
            //begin stopwatch
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //parse user input
            num = Convert.ToInt32(Console.ReadLine());
            //perform calculation
            Double inv = 1 / (12 * doSummation(num));
            //stop stopwatch
            stopwatch.Stop();
            //display info
            Console.WriteLine(inv);
            Console.WriteLine("3.14159265358979323846264338327950288419716939937510");
            Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed.TotalMilliseconds);
            //write to pi.txt
            TextWriter pi = new StreamWriter("pi.txt");
            pi.WriteLine(inv);
            pi.Close();
            //write to stats.txt
            TextWriter stats = new StreamWriter("stats.txt");
            stats.WriteLine(stopwatch.Elapsed.TotalMilliseconds);
            stats.Close();
        }
    }
}

So, I've included the J# library, and included java.math. Now when I replace all the "double"s with "BigDecimal"s, I get these compile errors:

http://f.cl.ly/items/1r2X26470d0d0n260p0p/Image%202011-11-14%20at%206.16.19%20PM.png

I know that this isn't the problem with me using Int for the loops, as it worked perfectly with Doubles. My question is, how do you resolve these errors relating to int and BigDecimal, or can you recommend another arbitrary precision library?

I've tried using XMPIR, have gotten everything to compile, but I get:

http://f.cl.ly/items/1l3C371j2u3z3n2g3a0j/Image%202011-11-14%20at%206.20.24%20PM.png

So I can I use p/invoke to include xmpir so I can use whatever the bigdecimal class is?

Thank you for your time!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

辞别 2024-12-22 16:35:57

在比较它们之前,你不能将你的 int 转换为 BigDecimal 吗?

我假设您了解这里的问题是接受 int 的 BigDecimal 类上没有大于、小于等符号的运算符重载。

Can you not convert your int's to BigDecimal's before comparing them?

I assume you understand the problem here is that there is no operator overload for the greater, less than, etc. signs on the BigDecimal class that accepts an int.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文