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 всё заработало нормально. Багу на компилятор по этому поводу вешать? С уважением, Роман