Financial Calculations

Compound Interest Calculator

Calculate compound interest with extreme precision, avoiding rounding errors that accumulate with standard floating-point.

CompoundInterest.cs
using BigFloatLibrary;

// $10,000 at 5% annual rate, compounded daily for 30 years
BigFloat principal = new("10000.00000000000000");
BigFloat rate = new("0.05");
int compoundings = 365;
int years = 30;

BigFloat finalAmount = Calculate(principal, rate, compoundings, years);
BigFloat earned = finalAmount - principal;

Console.WriteLine($"Initial Investment: ${principal}");
Console.WriteLine($"Final Amount: ${finalAmount}");
Console.WriteLine($"Interest Earned: ${earned}");

// Compare with double precision (Correct is 44,812.29)
double doubleFinal = 10000 * Math.Pow(1 + 0.05 / 12, 12 * 30);
Console.WriteLine($"\nDouble precision: ${doubleFinal}");
Console.WriteLine($"Incorrect By: ${doubleFinal - (double)finalAmount}");

static BigFloat Calculate(
    BigFloat principal,
    BigFloat annualRate,
    int compoundingsPerYear,
    int years)
{
    // Formula: A = P(1 + r/n)^(nt)
    BigFloat ratePerPeriod = annualRate / compoundingsPerYear;
    BigFloat onePlusRate = BigFloat.OneWithAccuracy(ratePerPeriod.Precision) + ratePerPeriod;
    int totalPeriods = compoundingsPerYear * years;

    BigFloat amount = principal * BigFloat.Pow(onePlusRate, totalPeriods);
    return amount;
}

Output:

Initial Investment: $10000.00000000000000
Final Amount: $44812.2868852451525
Interest Earned: $34812.2868852451525

Double precision: $44677.443140061085
Incorrect By: $-134.84374518406548

Currency Conversion with Exchange Rates

Handle currency conversions with many decimal places, crucial for large transactions.

CurrencyConverter.cs
using BigFloatLibrary;

Dictionary exchangeRates = [];
CurrencyConverter converter = new();

// Set precise exchange rates
converter.SetExchangeRate("USD", "EUR", "0.92385647291038475");
converter.SetExchangeRate("EUR", "JPY", "157.38492018374659");
converter.SetExchangeRate("USD", "BTC", "0.000015823947562839");
converter.SetExchangeRate("USD", "JPY", "145.401077250238547");

// Convert $1,000,000 through multiple currencies
BigFloat usd = new("1000000.0000000000");
BigFloat eur = converter.Convert(usd, "USD", "EUR");
BigFloat jpy = converter.Convert(eur, "EUR", "JPY");
BigFloat backToUsd = converter.Convert(jpy, "JPY", "USD");

Console.WriteLine($"Original USD:     ${usd}");
Console.WriteLine($"Converted to EUR: €{eur}");
Console.WriteLine($"Converted to JPY: Β₯{jpy}");
Console.WriteLine($"Back to USD:      ${backToUsd}");
Console.WriteLine($"Precision loss:   ${usd - backToUsd}");

class CurrencyConverter
{
    Dictionary exchangeRates = [];

    public void SetExchangeRate(string from, string to, string rate)
    {
        string key = $"{from}-{to}";
        exchangeRates[key] = new BigFloat(rate);
    }

    public BigFloat Convert(BigFloat amount, string from, string to)
    {
        string key = $"{from}-{to}";
        if (exchangeRates.TryGetValue(key, out BigFloat rate))
        {
            return amount * rate;
        }

        // Try reverse conversion
        string reverseKey = $"{to}-{from}";
        if (exchangeRates.TryGetValue(reverseKey, out BigFloat reverseRate))
        {
            return amount / reverseRate;
        }

        throw new InvalidOperationException($"No exchange rate found for {from} to {to}");
    }
}

Output:

Original USD:     $1000000.0000000000
Converted to EUR: ?923856.4729103848
Converted to JPY: Β₯145401077.2502385
Back to USD:      $1000000.0000000000
Precision loss:   $0.0000000000

Scientific Computing

Calculating Ο€ Using Machin's Formula

Compute Ο€ to arbitrary precision using the Machin formula.

MachinPi.cs
using BigFloatLibrary;
using static BigFloatLibrary.BigFloat;

Console.WriteLine("Calculating Ο€ to various precisions:");

foreach (int bits in new[] { 100, 500, 1000 })
{
    var start = DateTime.Now;
    BigFloat pi = CalculatePi(bits);
    var elapsed = DateTime.Now - start;

    Console.WriteLine($"\nPrecision: {bits} bits");
    Console.WriteLine($"Ο€ = {pi.ToString()}");
    Console.WriteLine($"Time: {elapsed.TotalMilliseconds:F2}ms");

    // Compare with library constant
    BigFloat libraryPi = Constants.GetConstant(Catalog.Pi, bits);
    Console.WriteLine($"Difference from library: {BigFloat.Abs(pi - libraryPi).ToString(true)}");
}

// Machin's formula: Ο€/4 = 4*arctan(1/5) - arctan(1/239)
static BigFloat CalculatePi(int precision)
{
    BigFloat arctan5 = ArcTan(BigFloat.OneWithAccuracy(precision) / 5, precision);
    BigFloat arctan239 = ArcTan(BigFloat.OneWithAccuracy(precision) / 239, precision);

    BigFloat piOver4 = 4 * arctan5 - arctan239;
    return 4 * piOver4;
}

// Calculate arctan(x) using Taylor series
static BigFloat ArcTan(BigFloat x, int precision)
{
    BigFloat sum = BigFloat.ZeroWithAccuracy(precision);
    BigFloat term = x;
    BigFloat xSquared = x * x;
    int n = 1;

    while (term.Precision > 0)
    {
        sum += term / n;
        term *= -xSquared;
        n += 2;

        // Limit iterations for reasonable computation time
        if (n > precision) break;
    }

    return sum;
}

Output:

Calculating Ο€ to various precisions:

Precision: 100 bits
Ο€ = 3.14159265358979323846264338328
Time: 13500.95ms
Difference from library: 1e-38

Precision: 500 bits
Ο€ = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940813
Time: 0.78ms
Difference from library: 3e-159

Precision: 1000 bits
Ο€ = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141274
Time: 2.23ms
Difference from library: 1e-309

Mandelbrot Set Computation

Calculate points in the Mandelbrot set with arbitrary precision for deep zooms.

Mandelbrot.cs
using BigFloatLibrary;

// Deep zoom coordinates requiring high precision
BigFloat centerX = new("-0.5000000000000000000");
BigFloat centerY = new("0.00000000000000000");
BigFloat zoom = new("0.0400000000000000"); //new("5e-13");

int width = 70;
int height = 60;
int maxIter = 200;

Console.WriteLine("Mandelbrot set visualization:");
Console.WriteLine($"Center: ({centerX}, {centerY})");
Console.WriteLine($"Zoom: {zoom}\n");

for (int py = 0; py < height; py++)
{
    for (int px = 0; px < width; px++)
    {
        BigFloat x = centerX + (px - width / 2) * zoom;
        BigFloat y = centerY + (py - height / 2) * zoom;

        int iterations = CalculateIterations(x, y, maxIter);

        // Simple ASCII visualization
        if (iterations == maxIter)
            Console.Write("β–ˆ");
        else if (iterations > maxIter * 0.3)
            Console.Write("β–“");
        else if (iterations > maxIter * 0.2)
            Console.Write("β–’");
        else if (iterations > maxIter * 0.1)
            Console.Write("β–‘");
        else
            Console.Write(" ");
    }
    Console.WriteLine();
}

static int CalculateIterations(
        BigFloat x0,
        BigFloat y0,
        int maxIterations,
        BigFloat escapeRadius = default)
{
    if (escapeRadius == default)
        escapeRadius = new BigFloat("4.0000000");

    //BigFloat x = BigFloat.ZeroWithAccuracy(100);
    //BigFloat y = BigFloat.ZeroWithAccuracy(100);
    BigFloat x = new("0.000000000000000001");
    BigFloat y = new("0.000000000000000001");

    for (int i = 0; i < maxIterations; i++)
    {
        BigFloat xSquared = x * x;
        BigFloat ySquared = y * y;

        // Check if escaped
        if (xSquared + ySquared > escapeRadius)
            return i;

        // z = zΒ² + c
        BigFloat xNew = xSquared - ySquared + x0;
        y = 2 * x * y + y0;
        x = xNew;
    }

    return maxIterations;
}

Output:

Mandelbrot set visualization:
Center: (-0.5000000000000000000, 0.00000000000000000)
Zoom: 0.0400000000000000
                                                β–‘
                                            β–’β–“β–‘
                                    β–ˆ       β–’β–’β–“
                                            β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                                            β–‘β–“β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘
                                            β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                β–‘  β–ˆ       β–ˆβ–ˆβ–ˆβ–ˆ    β–‘
                                    β–ˆ  β–‘β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–’β–’β–’
                                    β–ˆβ–ˆβ–’β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’    β–‘
                                    β–‘β–ˆβ–ˆβ–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“ β–ˆβ–ˆβ–’
                                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                    β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                                β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                                β–“β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–‘   β–‘        β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–‘  β–’β–’      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                    β–‘β–ˆβ–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘  β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘ β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘
                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                β–‘β–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                β–‘β–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                    β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘ β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘
                    β–‘β–ˆβ–‘β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘  β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                    β–‘  β–’β–’      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                    β–‘   β–‘        β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                                β–“β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                                β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                                β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ
                                    β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                    β–‘β–ˆβ–ˆβ–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“ β–ˆβ–ˆβ–’
                                    β–ˆβ–ˆβ–’β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’    β–‘
                                    β–ˆ  β–‘β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“β–’β–’β–’
                                β–‘  β–ˆ       β–ˆβ–ˆβ–ˆβ–ˆ    β–‘
                                            β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘
                                            β–‘β–“β–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘
                                            β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–“
                                    β–ˆ       β–’β–’β–“
                                            β–’β–“β–‘
                                                β–‘

Geometry & Trigonometry

High-Precision Circle Calculations

Calculate circle properties with extreme precision.

CircleCalculations.cs
using BigFloatLibrary;

var calc = new CircleCalculations(2000); // 2000 bits precision

// Earth's radius at equator (meters)
BigFloat earthRadius = BigFloat.SetPrecision(new BigFloat("6378137"), 2000);

Console.WriteLine("Earth Calculations (at equator):");
Console.WriteLine($"Radius: {earthRadius} meters");

BigFloat circumference = calc.Circumference(earthRadius);
Console.WriteLine($"Circumference: {circumference} meters");
Console.WriteLine($"             = {circumference / 1000} kilometers");

BigFloat area = calc.Area(earthRadius);
Console.WriteLine($"Surface area: {area} square meters");
Console.WriteLine($"            = {area / 1000000} square kilometers");

// Calculate arc length for 1 degree
BigFloat oneDegreeRadians = calc.pi / 180;
BigFloat arcLength = calc.ArcLength(earthRadius, oneDegreeRadians);
Console.WriteLine($"\nArc length of 1Β°: {arcLength} meters");
Console.WriteLine($"                = {arcLength / 1000} kilometers");

// Demonstrate precision vs double
double doubleCirc = 2 * Math.PI * 6378137;
Console.WriteLine($"\nDouble precision circumference: {doubleCirc}");
Console.WriteLine($"Difference: {circumference - (BigFloat)doubleCirc} meters");

public class CircleCalculations
{
    public readonly BigFloat pi;

    public CircleCalculations(int precisionBits = 1000)
    => pi = BigFloat.Constants.GetConstant("Pi", precisionBits);

    public BigFloat Area(BigFloat radius) => pi * radius * radius;

    public BigFloat Circumference(BigFloat radius) => 2 * pi * radius;

    public BigFloat ArcLength(BigFloat radius, BigFloat angleRadians)
    => radius * angleRadians;

    public static BigFloat SectorArea(BigFloat radius, BigFloat angleRadians)
    => radius * radius * angleRadians / 2;
}

Output:

Earth Calculations (at equator):
Radius: 6378137.00000000000000000000 meters
Circumference: 40075016.685578486153176817761400357374609362882844278631351340354296798420282204407764836313606189059256908100139133742942350385552850243807420177358564732338022005391910068106377301750152963557105603262912166299801979504579074571197800263634786735862384999027382997235010474655210111659324060127354352339832393109971773229948598404534193780409542317886674685202063175352246124247754603037775230754064109063198477709573081839073372320095045568480203001720014521496943274522109078454959123775917562568374219911837794324879125494483798432799039182587258703479771115557382046302066983849065385273851073281 meters
= 40075.016685578486153176817761400357374609362882844278631351340354296798420282204407764836313606189059256908100139133742942350385552850243807420177358564732338022005391910068106377301750152963557105603262912166299801979504579074571197800263634786735862384999027382997235010474655210111659324060127354352339832393109971773229948598404534193780409542317886674685202063175352246124247754603037775230754064109063198477709573081839073372320095045568480203001720014521496943274522109078454959123775917562568374219911837794324879125494483798432799039182587258703479771115557382046302066983849065385273851073281 kilometers
Surface area: 127801973348952.754468782364453122395592109418974747879388465671956666759492971739187363994895377618933920839029548557036904546930529449797743563753878611993110117329702170553030902502126407686261613430539250407813460049075698732474157912090049393883556552335270757753917759001892978927974233091444251753384860780146628017896772331791050254557999988505389380808325315807525824519085600400277773298478017097194010774511551663740910960854787026828504808266390744130048474643065310615664738810421379757383581320932914686990950785422005205342388782687454775232618178451833907026327463303083063174617202331491 square meters
= 127801973.348952754468782364453122395592109418974747879388465671956666759492971739187363994895377618933920839029548557036904546930529449797743563753878611993110117329702170553030902502126407686261613430539250407813460049075698732474157912090049393883556552335270757753917759001892978927974233091444251753384860780146628017896772331791050254557999988505389380808325315807525824519085600400277773298478017097194010774511551663740910960854787026828504808266390744130048474643065310615664738810421379757383581320932914686990950785422005205342388782687454775232618178451833907026327463303083063174617202331491 square kilometers

Arc length of 1Β°: 111319.490793273572647713382670556548262803785785678551753753723206379995611895012243791211982239414053491411389275371508173195515424584010576167159329346478716727792755305744739936949305980454325293342396978239721672165290497429364438334065652185377395513886187174992319473540708916976831455722575984312055089980861032703416523884457039427167804284216351874125561286598200683678465985008438264529872400302953329104748814116219648256444708459912445008338111151448602620207005858551263775343821993229356595055310660539791330904151343884535552886618297940842999364209881616795283519399580737181316252981336 meters
= 111.319490793273572647713382670556548262803785785678551753753723206379995611895012243791211982239414053491411389275371508173195515424584010576167159329346478716727792755305744739936949305980454325293342396978239721672165290497429364438334065652185377395513886187174992319473540708916976831455722575984312055089980861032703416523884457039427167804284216351874125561286598200683678465985008438264529872400302953329104748814116219648256444708459912445008338111151448602620207005858551263775343821993229356595055310660539791330904151343884535552886618297940842999364209881616795283519399580737181316252981336 kilometers

Double precision circumference: 40075016.68557849
Difference: 0.000000 meters

Spherical Trigonometry

Calculate distances on a sphere using the haversine formula.

SphericalDistance.cs
using BigFloatLibrary;

var calc = new SphericalDistanceNoInverse(200);
BigFloat earthRadius = new("6371000.00"); // meters

// New York City
BigFloat nycLat = new ("40.712800");
BigFloat nycLon = new ("-74.006000");
// London
BigFloat londonLat = new ("51.507400");
BigFloat londonLon = new ("-0.12780000");

BigFloat distance = calc.CalculateDistance(
nycLat, nycLon, londonLat, londonLon, earthRadius);

Console.WriteLine("Great Circle Distance: NYC β†’ London");
Console.WriteLine($"  NYC:    {nycLat}Β°N, {nycLon}Β°W");
Console.WriteLine($"  London: {londonLat}Β°N, {londonLon}Β°W");
Console.WriteLine($"  Distance = {distance} meters");
Console.WriteLine($"           = {distance / 1000} kilometers");
Console.WriteLine($"           = {distance / new BigFloat(1609.344)} miles");

class SphericalDistanceNoInverse(int precisionBits = 1000)
{
    private readonly BigFloat pi = BigFloat.Constants.GetConstant("Pi", precisionBits);
    readonly int precisionBits = precisionBits;

    // Convert degrees to radians
    BigFloat ToRadians(BigFloat degrees) => degrees * pi / BigFloat.SetPrecision(new BigFloat(180), precisionBits);

    /// 
    /// Solve for the central angle c (in radians) from haversine term a:
    ///     a = sinΒ²(dlat/2) + cos(lat1)*cos(lat2)*sinΒ²(dlon/2)
    /// so that:
    ///     cos(c) = 1 - 2a.
    /// We find c via Newton's method on f(c)=cos(c)-(1-2a)=0.
    ///
    
    BigFloat SolveCentralAngle(BigFloat a)
    {
        // target = 1 - 2a
        BigFloat one = BigFloat.OneWithAccuracy(precisionBits);
        BigFloat two = one * 2;
        BigFloat target = one - two * a;

        // initial guess: for small a, cβ‰ˆ2√a
        BigFloat c = two * BigFloat.Sqrt(a);

        // tolerance scaled to precision
        BigFloat tol = BigFloat.Pow(BigFloat.SetPrecision(BigFloat.SetPrecision(new BigFloat(10), precisionBits), precisionBits) , -((precisionBits / 3)));

        for (int iter = 0; iter < 50; iter++)
        {
            BigFloat f = BigFloat.Cos(c) - target;   // f(c)
            BigFloat df = -BigFloat.Sin(c);          // f'(c)

            if (df.IsZero)
            break;

            BigFloat delta = f / df;
            c -= delta;

            if (BigFloat.Abs(delta) < tol)
            break;
        }

        return c;
    }

    /// 
    /// Great‐circle distance using only Sin, Cos, Sqrt, +, βˆ’, Γ—, Γ·.
    ///
    
    public BigFloat CalculateDistance(
    BigFloat lat1, BigFloat lon1,
    BigFloat lat2, BigFloat lon2,
    BigFloat radius)
    {
        // to radians
        lat1 = ToRadians(lat1);
        lon1 = ToRadians(lon1);
        lat2 = ToRadians(lat2);
        lon2 = ToRadians(lon2);

        // deltas
        BigFloat dlat = lat2 - lat1;
        BigFloat dlon = lon2 - lon1;
        BigFloat half = BigFloat.OneWithAccuracy(precisionBits) /2;

        // haversine 'a'
        BigFloat sin_dlat2 = BigFloat.Sin(dlat * half);
        BigFloat sin_dlon2 = BigFloat.Sin(dlon * half);
        BigFloat a = sin_dlat2 * sin_dlat2
        + BigFloat.Cos(lat1)
        * BigFloat.Cos(lat2)
        * (sin_dlon2 * sin_dlon2);

        // central angle c via solver
        BigFloat c = SolveCentralAngle(a);

        // arc length
        return radius * c;
    }
}

Output:

Great Circle Distance: NYC β†’ London
NYC:    40.712800Β°N, -74.006000Β°W
London: 51.507400Β°N, -0.12780000Β°W
Distance = 5.572e+6 meters
= 5572.3 kilometers
= 3462.5 miles

Tips and Best Practices

🎯 Choose Appropriate Precision

Don't use more precision than needed. Higher precision means more memory and slower operations. Start with the minimum required and increase if needed.

// For financial calculations, 128-256 bits often sufficient
// For scientific computing, 500-1000 bits may be needed
// For mathematical research, 5000+ bits possible

πŸ” Use String Initialization for Exact Values

When you need exact decimal values, always use string initialization to avoid binary conversion issues.

// Good - exact representation
BigFloat exact = new("0.1");

// Avoid - loses precision
BigFloat approx = new(0.1);

⚑ Cache Constants

If using mathematical constants repeatedly, load them once and reuse.

// Load once
var constants = Constants.WithConfig(1000);
BigFloat pi = constants.Get("Pi");
BigFloat e = constants.Get("E");

// Reuse many times
for (int i = 0; i < 1000; i++)
{
    result = pi * radius[i] * radius[i];
}

βœ… Check Conversion Safety

Always check if a BigFloat fits in a standard type before converting.

if (bigValue.FitsInADouble())
{
    double d = (double)bigValue;
}
else
{
    // Handle overflow case
}