Схема: используя только R6RS, как определить мантиссу и показатель степени - PullRequest
2 голосов
/ 04 сентября 2010

Возможно ли извлечь мантиссу и экспоненту из числа с плавающей точкой в ​​основных реализациях Схемы R6RS, чтобы:
v = f x b ^ e
ф - мантисса
б - база
е - показатель степени

Например: 3,14 = 0,785 x 2 ^ 2

Если это не поддерживается, я хотел бы иметь доступ к битам flonum (IEEE 754) напрямую, чтобы решить проблему извлечения вышеуказанных значений, но я не нашел функции для преобразования flonum в серию байтов (bytevector) ).

Спасибо.

1 Ответ

3 голосов
/ 07 сентября 2010

http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-3.html#node_sec_2.8

- Процедура: bytevector-ieee-double-native-set! БАЙТЕКТОР К Х
- Процедура: bytevector-ieee-double-set! БАЙТЕКТОР K X ENDIANNESS

K, ..., K + 7 должны быть действительными индексами BYTEVECTOR.

Для `BYTEVECTOR-IEEE-DOUBLE-NATIVE-SET! ', K должно быть кратно 8.

Эти процедуры сохраняют представление X двойной точности IEEE 754 в элементах BYTEVECTOR от K до K + 7 и возвращают неопределенные значения.

Вот оно используется:

> (define bv (make-bytevector 8))
> (bytevector-ieee-double-native-set! bv 0 1.0)
> bv
#vu8(0 0 0 0 0 0 240 63)

Чтобы проверить результат, вот программа на C, которая напрямую обращается к байту:

#include <stdio.h>

int main(void)
{
  double x = 1.0;
  unsigned char *p = &x;

  for (size_t i = 0; i < sizeof(double); i++)
    printf("%u ", p[i]);

  puts("");

  return 0;
}
0 0 0 0 0 0 240 63 
...