Почему 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;
}