From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sa.int.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.5 X-Virus-Scanned: amavisd-new at localhost Message-ID: <4A7BC066.8050607@diyaorg.dp.ua> Date: Fri, 07 Aug 2009 08:49:26 +0300 From: Roman Savochenko User-Agent: Thunderbird 2.0.0.21 (X11/20090430) MIME-Version: 1.0 To: ALT Linux Sisyphus discussions References: <4A79BC9B.20207@diyaorg.dp.ua> In-Reply-To: Content-Type: multipart/mixed; boundary="------------070608020906030503010701" Subject: Re: [sisyphus] =?koi8-r?b?89TSwc7Oz9PUySDQ0skg0MXSxcjPxMUgz8LfxcTJ?= =?koi8-r?b?zsXOyckgxNfVyCDDxczZyCDXINfF3cXT1NfFzs7PxSDOwSB4ODZfNjQ=?= X-BeenThere: sisyphus@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Sisyphus discussions List-Id: ALT Linux Sisyphus discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Aug 2009 05:49:44 -0000 Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------070608020906030503010701 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit 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. > Если будет ругаться, то это наверно оно(см. оговорку в мане насчёт этой опции). > > Нарушение strict aliasing может сломать некоторые оптимизации. Два выхода -- > или собрать с -fno-strict-aliasing или переписать код корректней. > Я его записывал уже тремя различными способами с одинаковым результатом. :) int w1 = 62915, w2 = 16456; float vl = 0; *(ui16*)&vl = w1; *(((ui16*)&vl)+1) = w2; printf("TEST 00: %f\n",vl); и int w1 = 62915, w2 = 16456; char vl[4]; *(ui16*)vl = w1; *(((ui16*)vl)+1) = w2; printf("TEST 00: %f\n",*(float*)vl); С уважением, Роман --------------070608020906030503010701 Content-Type: text/x-vcard; charset=utf-8; name="rom_as.vcf" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="rom_as.vcf" begin:vcard fn:Roman Savochenko n:Savochenko;Roman adr;dom:;;;Dneprodzerjinsk email;internet:rom_as@diyaorg.dp.ua title:NIP "DIYA" tel;work:NIP "DIYA" tel;cell:+380679859815 x-mozilla-html:FALSE version:2.1 end:vcard --------------070608020906030503010701--