Схема: используя только 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 ENDIANNESSK,..., 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