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)