Kirill A. Shutemov wrote: > 2009/8/7 Roman Savochenko : > >> Kirill A. Shutemov 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. >>>> >>>> Кто нибуть может такое поведение объяснить? >>>> >>>> >>> Похоже, вы нарушили strict aliasing. Попробуйте собрать с >>> -Wstrict-aliasing=2. >>> Если будет ругаться, то это наверно оно(см. оговорку в мане насчёт этой >>> опции). >>> In file included from statfunc.cpp:25: sysfnc.h:401: warning: floating constant exceeds range of ‘double’ sysfnc.h: In member function ‘virtual void FLibSYS::floatSplitWord::calc(TValFunc*)’: sysfnc.h:994: warning: dereferencing type-punned pointer will break strict-aliasing rules sysfnc.h:995: warning: dereferencing type-punned pointer will break strict-aliasing rules sysfnc.h: In member function ‘virtual void FLibSYS::floatMergeWord::calc(TValFunc*)’: sysfnc.h:1021: warning: dereferencing type-punned pointer will break strict-aliasing rules >>> Нарушение strict aliasing может сломать некоторые оптимизации. Два выхода >>> -- >>> или собрать с -fno-strict-aliasing или переписать код корректней. >>> С -fno-strict-aliasing работает. >> Я его записывал уже тремя различными способами с одинаковым результатом. :) >> > И во всех трёх вариантах нарушили strict aliasing. Используйте union. > С ним работает, но это не решение, поскольку приведенные мною обороты распространены и я не уверен что подобных проблем нет в других частях моей, в общем-то не маленькой, программы. В любом случае спасибо за прояснение ситуации. И думаю багу повесить нужно. С уважением, Роман