Как изменить x * x
, сохранив его в «переменной auto
»? Я думаю, что он должен оставаться прежним, и мои тесты показывают, что типы, размеры и значения, по-видимому, одинаковы.
Но даже x * x == (xx = x * x)
ложно. Что за черт?
(Примечание: я знаю IEEE 754 и то, как работают float и double, и их обычные проблемы, но этот меня сбивает с толку.)
#include <iostream>
#include <cmath>
#include <typeinfo>
#include <iomanip>
using namespace std;
int main() {
auto x = sqrt(11);
auto xx = x * x;
cout << boolalpha << fixed << setprecision(130);
cout << " xx == 11 " << ( xx == 11 ) << endl;
cout << "x * x == 11 " << (x * x == 11 ) << endl;
cout << "x * x == xx " << (x * x == xx ) << endl;
cout << "x * x == (xx = x * x) " << (x * x == (xx = x * x)) << endl;
cout << "x * x == x * x " << (x * x == x * x ) << endl;
cout << "types " << typeid(xx).name() << " " << typeid(x * x).name() << endl;
cout << "sizeofs " << sizeof(xx) << " " << sizeof(x * x) << endl;
cout << "xx " << xx << endl;
cout << "x * x " << x * x << endl;
}
Вот результат:
xx == 11 true
x * x == 11 false
x * x == xx false
x * x == (xx = x * x) false
x * x == x * x true
types d d
sizeofs 8 8
xx 11.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
x * x 11.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Скомпилировано с этим:
C:\Stefan\code\leetcode>g++ test4.cpp -static-libstdc++ -std=c++11 -o a.exe
C:\Stefan\code\leetcode>g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
long double
, но это зависит от того, что поддерживает ваш компилятор. Некоторые будут использовать 10 байтов дляlong double
, другие будут использовать 8. Я не знаком с g++, чтобы сказать, что он делает. 17.02.2016long double
сработало, теперь все сравнения показывают то, что я ожидал (аsizeof
равно 12). Спасибо! 17.02.2016long double
может быть выровнено до 4 байтов по соображениям производительности. 17.02.2016FLT_EVAL_METHOD
18.02.2016