В Чтв, 06/08/2009 в 10:17 +0300, Roman Savochenko пишет: > Alexey Rusakov wrote: > >> Имеется некая целевая задачка собрать из двух 16-разрядных целых > >> вещественное (float), 32 разряда. > >> Казалось-бы тривиальная задача, которая решается кодом типа > >> int w1 = 62915, w2 = 16456; > >> ui32 vl = ((w2&0xffff)<<16) | w1&0xffff; > >> //sleep(1); > >> printf("TEST 00: %f\n",*(float*)&vl); > >> > >> И как ожидалось на x86_32 он работает корректно при различной нагрузке. > >> А вот на x86_64 замечается ситуация когда вместо 3.14 получаем ноль. > >> Причём в тестовой программке с единственным потоком всё работает > >> нормально, а на высоконагруженном процессе с десятками потоков, из > >> которых около пяти работают с периодом 5мс. устойчиво получатся 0. > >> Если раскомментирую sleep, то получаю номальный результат 3.14. > >> > >> Кто нибуть может такое поведение объяснить? > >> > > Объяснить не могу, но поиграйтесь с опциями отладки и оптимизации(-O, > > -g) и смотрите объектный код, генерируемый компилятором (-S). > > > Да действительно, проблема связана с ключом -O2. Сменил на -O1 всё > заработало нормально. > > Багу на компилятор по этому поводу вешать? Наверное, имеет смысл, хотя бы для истории. -- Alexey "Ktirf" Rusakov GNOME Project ALT Linux Team