Code Examples
Practical examples demonstrating BigFloat's capabilities
Financial Calculations
Compound Interest Calculator
Calculate compound interest with extreme precision, avoiding rounding errors that accumulate with standard floating-point.
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.
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.
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.
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.
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.
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
}