Приветствую. Я пытался немного оптимизировать сравнение знаков у двух переменных типа double. Вот что получилось:
#include <iostream>
using namespace std;
inline bool sign(double x){return !((*(((unsigned int*)&(x)) + 1))&0x80000000);}
inline bool sign1(double x){return (x>=0.0);}
inline bool cmp(double x,double y){
return ((*(((unsigned int*)&(x)) + 1))&0x80000000)^((*(((unsigned int*)&(y)) + 1))&0x80000000);
}
inline bool cmp1(double x,double y){
return ((x>=0.0)!=(y>=0.0));
}
int main(void){
double a(1.0),b(1.0);
cout << sign(a) << " " << sign(b) << " " << sign1(a) << " " << sign1(b) << endl;
cout << cmp(a,b) << " " << cmp1(a,b) << endl;
cout << a << " " << b << endl;
}
Проблема в том, что программа не правильно работает с оптимизацией -O2 и -O3.
Для gcc 3.4.3 я получаю:
g++-3.4 gcc_bug2.cpp -O2;./a.out
0 1 1 1
1 0
1 1
gcc 3.3.2 20031216 (prerelease) (SuSE Linux):
g++ gcc_bug2.cpp -O3;./a.out
1 1 1 1
1 0
1 1
Правильный ответ должен быть:
1 1 1 1
0 0
1 1
Без оптимизции и на интеловском компиляторе все работает правильно.

Ответ на:
комментарий
от Selecter

Ответ на:
комментарий
от Selecter


Ответ на:
комментарий
от Selecter
Ответ на:
комментарий
от Evgeny_I
Ответ на:
комментарий
от WidowMaker
Ответ на:
комментарий
от Evgeny_I
Ответ на:
комментарий
от WidowMaker
Ответ на:
комментарий
от Evgeny_I
Ответ на:
комментарий
от dilmah
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.