Skip to content
Arbitrary-precision fixed point number that using std.bigint internally
Branch: master
Clone or download
Latest commit d1113d4 Aug 13, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
source
.gitignore
.travis.yml
LICENSE
README.md
dub.json Modify description Jul 24, 2017
dub.selections.json

README.md

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.

You can’t perform that action at this time.