Ah, you beat me to it. Here's my code, with a few tests.
Brad
;; Obviously, no error checking, etc. ;; You can use read-u8 to read the bytes from a port ;; and stick them into bytevector (or do something similar ;; with the bytes directly)
;; these procedures names and calling sequences taken from the bytevector ;; library of R6RS. Unfortunately, IEEE 754 does not say what the ;; specific bit sequences representing the numbers are supposed to be, ;; but usually there are only two ways that machines do it.
(define (bytevector-ieee-double-native-ref bytevector k ) ;; extracts a double (with native endianness) from bytevector, ;; which I take in gambit to be a u8vector, from the positions ;; k, k+1, ..., k+7 (let ((aliased-vector (f64vector 0.))) (do ((i 0 (+ i 1))) ((= i 8) (f64vector-ref aliased-vector 0)) (##u8vector-set! aliased-vector i (u8vector-ref bytevector (+ k i))))))
(define (bytevector-ieee-double-native-set! bytevector k x ) ;; inserts a double (with native endianness) into bytevector, ;; which I take in gambit to be a u8vector, into the positions ;; k, k+1, ..., k+7 (let ((aliased-vector (f64vector x))) (do ((i 0 (+ i 1))) ((= i 8)) (u8vector-set! bytevector (+ k i) (##u8vector-ref aliased- vector i)))))
#|
On my powerpc Mac portable, result is
(load "binary.scm")
63 191 -1. 240 248 -1.5 "/Users/lucier/Desktop/binary.scm"
On my Intel box, the sign bit is on the other end (everything is reversed) so you get
(load "binary.scm")
0 128 1.0000000000000284 0 8 1.0000000000004832
|#
(define bytevector (make-u8vector 8 0))
(bytevector-ieee-double-native-set! bytevector 0 1. )
(display (u8vector-ref bytevector 0)) (newline)
(u8vector-set! bytevector 0 (bitwise-ior 128 (u8vector-ref bytevector 0)))
(display (u8vector-ref bytevector 0)) (newline)
(display (bytevector-ieee-double-native-ref bytevector 0))(newline)
(display (u8vector-ref bytevector 1)) (newline)
(u8vector-set! bytevector 1 (+ 8 (u8vector-ref bytevector 1)))
(display (u8vector-ref bytevector 1)) (newline)
(display (bytevector-ieee-double-native-ref bytevector 0))(newline)