[sisyphus] Странности при переходе объединении двух целых в вещественное на x86_64
Alexey Rusakov
ktirf на altlinux.org
Чт Авг 6 01:34:41 MSD 2009
В Срд, 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
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : отсутствует
Тип : application/pgp-signature
Размер : 197 байтов
Описание: Эта часть сообщения подписана цифровой подписью
Url : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20090806/00e50663/attachment.bin>
Подробная информация о списке рассылки Sisyphus