[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