Как я могу читать и писать двоичные числа с плавающей запятой с помощью Chicken Scheme?

Я читаю двоичный формат данных с помощью Chicken, и до сих пор я работал с целыми числами, делая такие вещи, как (fx+ (fxshl (read-byte) 8) (read-byte)) (Big Endian).

Как я могу читать и писать поплавки? Я должен уметь читать и писать IEEE 754-2008 32-битные и 64-битные двоичные числа с плавающей запятой.


person erjiang    schedule 03.02.2011    source источник


Ответы (1)


Я пока не нашел хороших библиотек для этого, но я собрал кое-что, что работает. Обратите внимание, что в качестве операций ввода мне доступны только read-byte и read-string.

  ;;
  ;; These are some unfun C routines to convert 4 int-promoted bytes to a float
  ;; by manually assembling the float using bitwise operators
  ;;
  ;; Caveat! These will only work on platforms in which floats are 32-bit Big
  ;; Endian IEEE754-2008 numbers and doubles are 64-bit Big Endian IEEE754-2008
  ;; numbers! Also, stdint.h.
  ;;
  (define (readFloat)
    (let ([c-read-float
            (foreign-lambda* float
              ((int i1)
               (int i2)
               (int i3)
               (int i4))
               "uint8_t b1 = (uint8_t) i1;
                uint8_t b2 = (uint8_t) i2;
                uint8_t b3 = (uint8_t) i3;
                uint8_t b4 = (uint8_t) i4;

                uint32_t i = 0;

                i = b1;
                i = (i << 8) | b2;
                i = (i << 8) | b3;
                i = (i << 8) | b4;

                float f = *(float*)&i;

                C_return(f);")])
        (let* ([i1 (read-byte)]
               [i2 (read-byte)]
               [i3 (read-byte)]
               [i4 (read-byte)])
          (c-read-float i1 i2 i3 i4))))
person erjiang    schedule 06.02.2011
comment
яйцо bitstring теперь доступно, что значительно упрощает работу. - person sjamaan; 19.09.2015