2 Stimmen

Arbitrary Precision für Dezimalzahlen in C# Hilfe?

Hier ist mein aktueller Code zur Berechnung von Pi mit der Chudnovsky-Methode 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();
        }
    }
}

Also, ich habe die J#-Bibliothek und java.math eingeschlossen. Nun, wenn ich alle "double "s mit "BigDecimal "s ersetzen, bekomme ich diese Kompilierfehler:

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

Ich weiß, dass dies nicht das Problem ist, wenn ich Int für die Schleifen verwende, da es mit Doubles perfekt funktioniert. Meine Frage ist, wie Sie diese Fehler in Bezug auf int und BigDecimal zu beheben, oder können Sie eine andere beliebige Präzision Bibliothek empfehlen?

Ich habe versucht, mit XMPIR, haben alles zu kompilieren, aber ich bekomme:

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

Also kann ich p/invoke verwenden, um xmpir einzuschließen, damit ich verwenden kann, was auch immer die bigdecimal-Klasse ist?

Vielen Dank für Ihre Zeit!

1voto

Brandon Moore Punkte 8322

Können Sie Ihre int's nicht in BigDecimal's konvertieren, bevor Sie sie vergleichen?

Ich nehme an, Sie verstehen das Problem hier ist, dass es keine Operatorüberladung für die Zeichen größer, kleiner als, etc. auf die BigDecimal-Klasse, die eine int akzeptiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X