A struct representing Fixed point number.
// 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);
This module provides arbitrary precision fixed-point arithmetic.