#lang racket/base (require (for-syntax racket/base) racket/unsafe/ops) (provide (all-defined-out)) ;; Returns the interpolated distance of z from za toward zb ;; Examples: if z = za, this returns 0.0 ;; if z = zb, this returns 1.0 ;; if z = (za + zb) / 2, this returns 0.5 ;; Intuitively, regard a use (solve-t z za zb) as "the point between za and zb". (define-syntax-rule (solve-t z za zb) (unsafe-fl/ (unsafe-fl- z za) (unsafe-fl- zb za))) (define-syntax-rule (unsolve-t za zb t) (unsafe-fl+ (unsafe-fl* t zb) (unsafe-fl* (unsafe-fl- 1.0 t) za))) (define-syntax-rule (unsafe-flavg4 z1 z2 z3 z4) (unsafe-fl* 0.25 (unsafe-fl+ (unsafe-fl+ (unsafe-fl+ z1 z2) z3) z4))) (define-syntax (check-all-real! stx) (syntax-case stx () [(_ name id ...) (with-syntax ([(i ...) (build-list (length (syntax->list #'(id ...))) values)]) (define ids (syntax->list #'(id ...))) #`(begin (unless (real? id) (raise-type-error name "real number" i #,@ids)) ...))])) (define-syntax-rule (let-exact->inexact (id ...) body0 body ...) (let ([id (exact->inexact id)] ...) body0 body ...))