https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87036
Bug ID: 87036 Summary: -O1/-O2 affects floating point precision on at least i686 and ppc64el Product: gcc Version: 6.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: other Assignee: unassigned at gcc dot gnu.org Reporter: doko at debian dot org Target Milestone: --- [forwarded from http://bugs.debian.org/906753] no difference in the results on x86_64-linux-gnu, the bug submitter claims that clang 6.0 is working as expected. Seen on at least i686 and ppc64el. Same behaviour down to GCC 5 on both archs. on ppc64el: $ g++ -O0 tst.cc && ./a.out $ g++ -O2 tst.cc && ./a.out different mass sq values: 2.42 2.42 difference is : 3.55271e-15 on i686: $ g++ -O0 tst.cc && ./a.out $ g++ -O2 tst.cc && ./a.out different mass sq values: 2.42 2.42 difference is : 1.77636e-15 $cat tst.cc #include <cmath> #include <algorithm> // for swap #include <iostream> namespace HepMC { class FourVector { public: double m_x, m_y, m_z, m_t; FourVector( double xin, double yin, double zin, double tin=0) : m_x(xin), m_y(yin), m_z(zin), m_t(tin) {} inline double m2() const { return m_t*m_t - (m_x*m_x + m_y*m_y + m_z*m_z); } inline double m() const { double mm = m2(); return mm < 0.0 ? -std::sqrt(-mm) : std::sqrt(mm); } }; } // HepMC int main() { double eps = 1.e-15; // allowed differnce between doubles // FourVector HepMC::FourVector vector(1.1,2.2,3.3,4.4); HepMC::FourVector v4 (1.1,2.2,3.3,4.4); //vector = v4; double masssq1 = v4.m2(); double mass1 = v4.m(); double masssq2 = vector.m2(); double mass2 = vector.m(); if( fabs( masssq1 - masssq2 ) > eps ) { std::cout << "different mass sq values: " << masssq1 << " " << masssq2 << std::endl; std::cout << "difference is : " << ( masssq1 - masssq2 ) << std::endl; } return 0; }