Skip to content
/ bigfixed Public

Arbitrary-precision fixed point number that using std.bigint internally

License

Notifications You must be signed in to change notification settings

kotet/bigfixed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bigfixed

Build Status Coverage Status DUB DUB

This module provides arbitrary precision fixed-point arithmetic.

// Return the square root of `n` to `prec` decimal places by a method of bisection.
string sqrt(ulong n, size_t prec)
{
    import std.conv : to;
    import std.math : ceil, log10;

    immutable size_t q = (prec / log10(2.0)).ceil.to!size_t() + 1;
    auto low = BigFixed(0, q);
    auto high = BigFixed(n, q);

    while ((high - low) != high.resolution) // BigFixed is integer internally.
    {
        immutable BigFixed mid = (high + low) >> 1; // Shift Expressions can be used.
        immutable bool isLess = (mid * mid) < n;
        if (isLess)
        {
            low = mid;
        }
        else
        {
            high = mid;
        }
    }
    return low.toDecimalString(prec);
}
// 10 digits before the 1,000th digit. See http://www.h2.dion.ne.jp/~dra/suu/chi2/heihoukon/2.html
immutable sqrt2_tail = "9518488472";
assert(sqrt(2, 1000)[$ - 10 .. $] == sqrt2_tail);

Documentation

Run dub fetch bigfixed && dub build bigfixed -b docs.

About

Arbitrary-precision fixed point number that using std.bigint internally

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages