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

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

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

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

Спасибо.

1 ответ

Решение

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

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

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

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

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

Здесь это используется:

> (определить bv (make-bytevector 8))
> (bytevector-ieee-double-native-set! bv 0 1.0)
> бв
#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 
Другие вопросы по тегам