Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Hi-prec math for visual studio c#?

  1. Jul 23, 2008 #1
    Is there a Hi-prec math for visual studio c#?

    Thanks in advance,

    Devin
     
  2. jcsd
  3. Jul 23, 2008 #2

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    There's at least one commercial package out there, but it's not cheap:
    http://www.extremeoptimization.com/

    What are your needs? What does the library need to do, and how fast does it need to work? Are you just using big numbers, or are you doing matrices? Basic operations (+, -, *, /, %, ^), transcendental (sin, sinh, asin, exp, log, erf, gamma), or specialized (bessel, hypergeom, prime operations, etc.)? Integer or floating-point?
     
  4. Jul 23, 2008 #3
    I'm doing floating point with basic math ops, ie: +,-,*,/,^, sqrt
     
  5. Jul 23, 2008 #4

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    Does it need to be fast? Is anything running in a tight loop, or are you just writing (say) a calculator where an extra millisecond won't hurt?
     
  6. Jul 23, 2008 #5
    Doesn't need to be fast.
     
  7. Jul 23, 2008 #6

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    You could write your own, then, or have someone write it. Quick code:

    Code (Text):
    class Bignum {
        protected ulong[] limb;
        public Bignum (long initialValue) {
            limb = new ulong[] {initialValue};
        }

        public Bignum (long[] initialValue) {
            Array.Copy(limb, initialValue, initialValue.Length);
        }

        public Bignum (string initialValue) {
            // Bad method, replace with a faster one if needed
            limb = new ulong[] {long.Parse(initialValue.Substring(0, 18))};
            for (int i = 18; i < initialValue.Length; ++i)
                limb = limb * 10 + long.Parse(initialValue[i]);
        }

        public Bignum (Bignum initialValue) {
            Array.Copy(limb, initialValue.limb, initialValue.limb.Length);
        }

        public static Bignum operator+ (Bignum a, Bignum b) {
            long carry = 0;
            int sz = Math.Max (a.limb.Length. b.limb.length);

            Bignum result = new Bignum(a);
            for (int i = 0; i < sz; ++i) {
                long o1 = result.limb[i];
                long o2 = b.limb[i];
                limb[i] += b.limb[i] + carry;
                if (result.limb[i] < o1 || result.limb[i] < o2)
                    carry = 1;
                else
                    carry = 0;
            }
            if (carry == 1) {
                Array.Copy(result.limb, result.limb, result.limb.Length + 1);
                result.limb[sz] = 1;
            }
            return result;
        }

        public static Bignum operator* (Bignum a, Bignum b) {
            // Code here
        }

        public static Bignum operator^ (Bignum a, uint b) {
            Bignum result = new Bignum(a);
            Bignum carry = new Bignum(0);
            while (b > 1) {
                if ((b&1) == 1)
                    carry *= result;
                result *= result;
                b >>= 1;
            }
            return result * carry;
        }
    }
    I haven't compiled this (or even used an IDE) but this should be a good start. Subtraction is easy, multiplication not too hard, and division... well, code that as far as you need it. I decided to do the exponentiation so it wouldn't be too slow.
     
  8. Jul 25, 2008 #7
    Cool, thanks for your time, effort & code. I like your usage of binary ops.

    -Devin
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Similar Discussions: Hi-prec math for visual studio c#?
Loading...