В Срд, 05/08/2009 в 20:08 +0300, Roman Savochenko пишет: > Приветствую Всех > > Имеется некая целевая задачка собрать из двух 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). -- Alexey "Ktirf" Rusakov GNOME Project ALT Linux Team