[sisyphus] Странности при переходе объединении двух целых в вещественное на x86_64

Alexey Rusakov ktirf на altlinux.org
Чт Авг 6 11:59:20 MSD 2009


В Чтв, 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
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: Эта часть сообщения подписана цифровой подписью
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20090806/732b6b01/attachment.bin>


Подробная информация о списке рассылки Sisyphus