Skip to content

cpp_bin_float fmod regression in boost version 1.90 #764

@cosurgi

Description

@cosurgi

Hi,

my continuous integration pipeline started reporting errors since boost version 1.90 when testing the fmod function. See for example this test run: https://gitlab.com/yade-dev/trunk/-/jobs/14168860931 search at the end for string "Error with: fmod".

The testing procedure is quite large: https://gitlab.com/yade-dev/trunk/-/blob/master/py/high-precision/_RealHPDiagnostics.cpp#L503
it is testing in a loop with 1000 random invocations of each mathematical function and compares the result against a higher precision type.

To reproduce I used this test program:

#include <iostream>
#include <boost/config.hpp>
#include <boost/core/demangle.hpp>
#include <boost/cstdfloat.hpp>
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <boost/multiprecision/mpfr.hpp>
#include <boost/multiprecision/float128.hpp>

int main()
{
	using std::sqrt;
	using std::fmod;

	double arg1g(-36.09543294408234714865102432668209L);
	double arg2g(99.88277539957428530215111095458269L);
	std::cout << std::setprecision(16);
	std::cout << fmod(arg1g,arg2g) << "\n";

	long double arg1a(-36.09543294408234714865102432668209L);
	long double arg2a(99.88277539957428530215111095458269L);
	std::cout << std::setprecision(18);
	std::cout << fmod(arg1a,arg2a) << "\n";

	boost::multiprecision::float128 arg1f("-36.09543294408234714865102432668209");
	boost::multiprecision::float128 arg2f("99.88277539957428530215111095458269");
	std::cout << std::setprecision(33);
	std::cout << fmod(arg1f,arg2f) << "\n";

	boost::multiprecision::cpp_bin_float_50  arg1b("-36.09543294408234714865102432668209");
	boost::multiprecision::cpp_bin_float_50  arg2b("99.88277539957428530215111095458269");
	std::cout << std::setprecision(50);
	std::cout << fmod(arg1b,arg2b) << "\n";

	boost::multiprecision::mpfr_float_50     arg1c("-36.09543294408234714865102432668209");
	boost::multiprecision::mpfr_float_50     arg2c("99.88277539957428530215111095458269");
	std::cout << std::setprecision(50);
	std::cout << fmod(arg1c,arg2c) << "\n";

	boost::multiprecision::cpp_bin_float_100 arg1d("-36.09543294408234714865102432668209");
	boost::multiprecision::cpp_bin_float_100 arg2d("99.88277539957428530215111095458269");
	std::cout << std::setprecision(100);
	std::cout << fmod(arg1d,arg2d) << "\n";

	boost::multiprecision::mpfr_float_100    arg1e("-36.09543294408234714865102432668209");
	boost::multiprecision::mpfr_float_100    arg2e("99.88277539957428530215111095458269");
	std::cout << std::setprecision(100);
	std::cout << fmod(arg1e,arg2e) << "\n";
}

Using older boost version 1.83, I am getting this output:

-36.09543294408235
-36.0954329440823471
-36.0954329440823471486510243266821
-36.09543294408234714865102432668209
-36.09543294408234714865102432668209
-36.09543294408234714865102432668209
-36.09543294408234714865102432668209

While using boost 1.90 I am getting this:

-36.09543294408235
-36.0954329440823471
-36.0954329440823471486510243266821
63.7873424554919381535000866279006
-36.09543294408234714865102432668209
63.7873424554919381535000866279006
-36.09543294408234714865102432668209

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions