#include "../include/TripleDouble.h" #include "../include/Types.h" #include #include const int nTests = 1000; using namespace boost::multiprecision; using namespace boost::random; std::vector generateRandom(int len, int seed) { uniform_real_distribution dist(0, 1); uniform_int_distribution expDist(-30, 30); independent_bits_engine::digits, cpp_int> gen(seed); std::vector numbers; for (int i = 0; i < len; i++) { mnd::Real m = dist(gen); int e = expDist(gen); numbers.push_back(m * pow(mnd::Real(2), e)); } return numbers; } template mnd::Real maxErr(Binary func) { mnd::Real maxRelErr = 0.0; auto a = generateRandom(nTests, 123); auto b = generateRandom(nTests, 456); for (int i = 0; i < nTests; i++) { T v1 = mnd::convert(a[i]); T v2 = mnd::convert(b[i]); mnd::Real r1 = mnd::convert(v1); mnd::Real r2 = mnd::convert(v2); //std::cout << r1 << " --- " << r2 << std::endl; T res = func(v1, v2); mnd::Real corrRes = func(r1, r2); mnd::Real relErr = abs(corrRes - mnd::convert(res)) / corrRes; if (relErr > maxRelErr) maxRelErr = relErr; } return maxRelErr; } int main() { mnd::Real doubleDoubleAdd = maxErr([] (const auto& a, const auto& b) { return a + b; }); mnd::Real doubleDoubleMul = maxErr([] (const auto& a, const auto& b) { return a * b; }); std::cout << "max double double add error: " << doubleDoubleAdd << std::endl; std::cout << "max double double mul error: " << doubleDoubleMul << std::endl; mnd::Real tripleDoubleAdd = maxErr([] (const auto& a, const auto& b) { return a + b; }); mnd::Real tripleDoubleMul = maxErr([] (const auto& a, const auto& b) { return a * b; }); std::cout << std::setprecision(10) << std::scientific; std::cout << "max triple double add error: " << tripleDoubleAdd << std::endl; std::cout << "max triple double mul error: " << tripleDoubleMul << std::endl; }