diff --git a/math.c b/math.c index 8b7ebb35..b2ca402e 100644 --- a/math.c +++ b/math.c @@ -115,7 +115,9 @@ modulo (SCM a, SCM b) { assert (TYPE (a) == NUMBER); assert (TYPE (b) == NUMBER); - return MAKE_NUMBER (VALUE (a) % VALUE (b)); + int x = VALUE (a); + while (x < 0) x += VALUE (b); + return MAKE_NUMBER (x % VALUE (b)); } SCM diff --git a/module/rnrs/bytevectors.mes b/module/rnrs/bytevectors.mes index 15fc1883..2deb0107 100644 --- a/module/rnrs/bytevectors.mes +++ b/module/rnrs/bytevectors.mes @@ -1,7 +1,7 @@ ;;; -*-scheme-*- ;;; Mes --- Maxwell Equations of Software -;;; Copyright © 2016 Jan Nieuwenhuizen +;;; Copyright © 2016,2017 Jan Nieuwenhuizen ;;; ;;; This file is part of Mes. ;;; @@ -29,17 +29,18 @@ (when (not (= 0 index)) (error "bytevector-u32-native-set! index not zero: " index " value: " value)) (let ((x (list (modulo value #x100) - (quotient (modulo value #x10000) #x100) - (quotient (modulo value #x1000000) #x10000) - (quotient value #x1000000)))) + (modulo (ash value -8) #x100) + (modulo (ash value -16) #x100) + (modulo (ash value -24) #x100)))) (set-car! bv (car x)) (set-cdr! bv (cdr x)) x)) (define (bytevector-u16-native-set! bv index value) (when (not (= 0 index)) (error "bytevector-u16-native-set! index not zero: " index " value: " value)) - (let ((x (list (modulo value #x100) - (quotient (modulo value #x10000) #x100)))) + (let ((x (list + (modulo value #x100) + (modulo (ash value -8) #x100)))) (set-car! bv (car x)) (set-cdr! bv (cdr x)) x))