1. Си / Говнокод #17821

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    #include "mono-math.h"
    
    #ifndef HAVE_SIGNBIT
    
    int
    mono_signbit_float (float x)
    {
    	union { float f; int i; } u;
    
    	u.f = x;
    
    	return u.i < 0;
    }
    
    int
    mono_signbit_double (double x)
    {
    	union { double d; int i[2]; } u;
    
    	u.d = x;
    
    #if G_BYTE_ORDER == G_LITTLE_ENDIAN
    	return u.i [1] < 0;
    #else
    	return u.i [0] < 0;
    #endif
    }
    
    #endif

    Говно тут в том, что int далеко не везде будет 32 бит.
    https://github.com/mono/mono/blob/master/mono/utils/mono-math.c оттуда

    Запостил: j123123, 19 Марта 2015

    Комментарии (5) RSS

    • а где это "далеко" где int не 32 бита?

      на вскидку я ни одной актуальной ILP64 архитектуры припомнить не могу.

      первые альфы (DEC Tru64) были ILP64, но осознали проблему портабельности очень быстро, и поменялись на LP64.
      Ответить
      • На avr, где он 16. Ну и в трубо си, где он тоже 16.
        Ответить
        • блин. и как я мог забыть про 8-битные контроллеры. шарп ведь настолько эффективен, что на 64К памяти просто будет летать.
          Ответить
          • > 64К памяти
            А у первых tiny 64 байта(!) памяти. Вот на них то как летать будет!
            Ответить
    • #include <stdint.h>
      s/int/int32_t/g
      Ответить

    Добавить комментарий