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;
}

Reply via email to