Приветствую. Я пытался немного оптимизировать сравнение знаков у двух переменных типа 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
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Что не так с кодом? (2011)
- Форум Неинициализированные переменные в C++ при использовании разных опций оптимизации g++ (2017)
- Форум gcc cos(1)=0.540302 (2011)
- Форум Реализация рестартов из Common Lisp в C++ (2016)
- Форум lambda vs std::function<...> (2014)
- Форум C++ частичная специализация шаблонов функций есть!!! (2005)
- Форум Функция, меняющая тип возвращаемого значения в зависимости от переменной C++ (2015)
- Форум Багофича эксепшенов с++ ? (2013)
- Форум Как лучше передать функцию: по указателю или ссылке? (C++) (2018)
- Форум C++ выбор версии функции при перегрузке и char (2018)