Почему GDB оценивает арифметику с плавающей точкой иначе, чем C ++?

Мы столкнулись с чем-то немного запутанным, пытаясь решить арифметическую задачу с плавающей точкой.

Сначала код. Я'Мы перевели суть моей проблемы в этот пример:

#include 
#include 

using namespace std;
typedef union {long long ll; double d;} bindouble;

int main(int argc, char** argv) {
    bindouble y, z, tau, xinum, xiden;
    y.d = 1.0d;
    z.ll = 0x3fc5f8e2f0686eee; // double 0.17165791262311053
    tau.ll = 0x3fab51c5e0bf9ef7; // double 0.053358253178712838
    // xinum = double 0.16249854626123722 (0x3fc4ccc09aeb769a)
    xinum.d = y.d * (z.d - tau.d) - tau.d * (z.d - 1);
    // xiden = double 0.16249854626123725 (0x3fc4ccc09aeb769b)
    xiden.d = z.d * (1 - tau.d);
    cout < hex < xinum.ll < endl < xiden.ll < endl;
}

Ответы на вопрос(3)

Ваш ответ на вопрос