Странное поведение компилятора
написал бы, что они отличаются только наличием cout =)
вот мой ответ чемберлену:
float F_Super( float x ) {
return x;
}
Такой ответ Чемберлену не катит
![](/images/graemlins/smile.gif)
![](/images/graemlins/smile.gif)
![](/images/graemlins/wink.gif)
какие могут быть тут исключения? если даже sizeof(long) == sizeof(float то кто бросит исключение?:)
в данном случае, я так понимаю, sizeof совпадает. а нельзя ли повпихивать куда ни попадя волшебное слово volatile ?
![](/images/graemlins/wink.gif)
Листинг уже поразглядывал. При включенной оптимизации такое ощущение, что тело первой функции зохавал сотона
union {
long l;
float f;
};
если даже sizeof(long) == sizeof(float то кто бросит исключение?В этом случае, пожалуй, никто не бросит. Только вот нет гарантии, что sizeof(long) == sizeof(float).
sizeof(int) = 4
sizeof(long int) = 8
sizeof(long long int) = 8
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 16
sizeof(void *) = 8
Так что далеко не всегда совпадает
![](/images/graemlins/smirk.gif)
я думаю, просто сигнал будет
![](/images/graemlins/wink.gif)
![](/images/graemlins/wink.gif)
А сегфолт не может быть в виде исключения?
[-O1]
F(9) = 9
x = 9
i = 7109200272258236416
F1(9) = 9
[-O2]
F(9) = 5.88128e-39
x = 9
i = 7109200272258236416
F1(9) = 9
[-O3]
F(9) = 0
x = 9
i = 7109200272258236416
F1(9) = 9
у тебя sizeof совпадает ?
Union делу помогает
![](/images/graemlins/smile.gif)
![](/images/graemlins/smile.gif)
![](/images/graemlins/smile.gif)
у тебя sizeof совпадает ?
упс
![](/images/graemlins/wink.gif)
это я у автора треда спросил
![](/images/graemlins/wink.gif)
лучше обходится более простыми и наглядными средствами.
кстати long лучше заменить на uint32_t так хоть на x86_64 будет работать.
* QA Notice: Package has poor programming practices which may compile
* fine but exhibit random runtime failures.
* q.cpp:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
q.cpp:7: warning: dereferencing type-punned pointer will break strict-aliasing rules
q.cpp:13: warning: dereferencing type-punned pointer will break strict-aliasing rules
q.cpp:15: warning: dereferencing type-punned pointer will break strict-aliasing rules
Да, sizeof у меня совпадает
Вообще такие приведения — опасная штука. Тем более приведение к указателю на такой тип, значения которого вовсе по данному указателю не храняться. Так что просто не надо писать так.
Union`ы спасают положение, но тоже не сильно. Это небезлпасно с точки зрения типов. Мб напишешь, зачем тебе такое нужно, а потом подумаешь над более изящным решением?
![](/images/graemlins/smile.gif)
Тыкие вывеорты с указателями нужны в алгоритме быстрого вычисления обратного квадратного корня
float Q_rsqrt( float x ){
float xhalf = 0.5f*x;
long i = * (long* ) &x;
cerr << i << endl;
i = 0x5f375a86 - (i >> 1);
cerr << i << endl;
x = * (float*) &i;
cerr << i << endl;
x = x * (1.5f - xhalf*x*x);
x = x * (1.5f - xhalf*x*x);
return x;
}
2. Правильная программа лучше быстрой программы. Сформулируй, а лучше сверься со стандартом, какие предположения и допущения ты делаешь. Вставь assert(sizeof(long)==sizeof(fload и тому подобное.
3. Перейди от Сишного приведения типов к С++: тебе, похоже, нужен reinterpret_cast. Решение с Union в твоем случае — обман системы типов, а не вариативная запись.
![](/images/graemlins/smile.gif)
какая инструкция выполняет вычисление обратного квадратного корня ?
</режим любопытства>
Если есть поддержка 3DNow!, то PFRSQRT и PFRSQRT1+PFRCPIT2.
Upd: http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Optimize-Options... -> grep for strict-aliasing
/*
** float q_rsqrt( float number )
*/
float Q_rsqrt( float number )
{
union {
float f;
int i;
} t;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
t.f = number;
t.i = 0x5f3759df - ( t.i >> 1 ); // what the fuck?
y = t.f;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
//assert( !isnan(y) ); // bk010122 - FPE?
return y;
}
У меня и компилится, и работает одинаково. Вот только результат не очень точный: Q_rsqrt(9) = 0.332953
![](/images/graemlins/smile.gif)
Это как раз и был кусок кода из Q3, чуть переделанный
в оригинале там не long, а int
А не подскажешь, как подружить GCC с inline assembly SSE?
t.i = 0x5f3759df - ( t.i >> 1 ); // what the fuck?реально
![](/images/graemlins/confused.gif)
реальноВ смысле не понятно что происходит?
Уже была, кажется, здесь тема про этот алгоритм.
Не-а, извиняйте. Пользуюсь только интеловским и мелкософтовским.
Оставить комментарий
stm7583298
Есть вот такой код:При компиляции с опцией -O3 первая функция возвращает 0, вторая работает нормально. Если отключить оптимизацию, первая функция тоже работает правильно. Как ее заставить работать со включенной оптимизацией?
Компилятор g++ 4.0.1