Схема: используя только R6RS, как определить мантиссу и показатель степени flonum

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

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

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

Спасибо.


person YasirA    schedule 04.09.2010    source источник
comment
Хорошо, специальные функции Racket, Chicken, Ikarus тоже подойдут. Вздох..   -  person YasirA    schedule 05.09.2010
comment
Я шокирован тем, что Scheme не счел нужным обеспечить рекомендованную 754 (и требуемую в пересмотренном стандарте) операцию logb.   -  person Stephen Canon    schedule 07.09.2010


Ответы (1)


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

- Процедура: bytevector-ieee-double-native-set! BYTEVECTOR K X
- Процедура: bytevector-ieee-double-set! БАЙТЕВЕКТОР K X КОНЕЧНОСТЬ

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

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

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

Вот он в употреблении:

> (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 
person Nietzche-jou    schedule 07.09.2010
comment
Ой, наверное, меня смутил set. Спасибо. :] - person YasirA; 07.09.2010