module: dfmc-modeling author: jonathan bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// SINGLE-FLOAT define function raw-sf-op (op :: , rx :: <&raw-single-float>, ry :: <&raw-single-float>) => (res) let x :: = ^raw-object-value(rx); let y :: = ^raw-object-value(ry); make-raw-literal(op(x, y)) end function raw-sf-op; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-as-raw (x :: ) => (r :: ) ^%single-float-data(x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-raw-as-single-float (r :: ) => (x :: ) make-compile-time-literal(^raw-object-value(r)) end; /// NOTE: The Dylan library expects this primitive to round towards zero (i.e., truncate) define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-as-integer (f :: ) => (i :: ) make-raw-literal(round(^raw-object-value(f))) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-integer-as-single-float (x :: ) => (z :: ) make-raw-literal(as(, ^raw-object-value(x))) end; define side-effect-free stateless dynamic-extent &primitive primitive-single-float-as-double-integer (f :: ) => (low :: , high :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-integer-as-single-float (low :: , high :: ) => (f :: ); define side-effect-free stateless dynamic-extent &primitive primitive-cast-single-float-as-machine-word (f :: ) => (b :: ); define side-effect-free stateless dynamic-extent &primitive primitive-cast-machine-word-as-single-float (b :: ) => (f :: ); define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-negate (x :: ) => (negated :: ) let x :: = ^raw-object-value(x); make-raw-literal(0.0 - x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-add (x :: , y :: ) => (sum :: ) raw-sf-op(\+, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-subtract (x :: , y :: ) => (difference :: ) raw-sf-op(\-, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-multiply (x :: , y :: ) => (product :: ) raw-sf-op(\*, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-divide (x :: , y :: ) => (ratio :: ) raw-sf-op(\/, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-equals? (x :: , y :: ) => (equal? :: ) raw-sf-op(\=, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-less-than? (x :: , y :: ) => (less? :: ) raw-sf-op(\<, x, y) end; define side-effect-free stateless dynamic-extent &primitive primitive-single-float-sqrt (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-log (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-exp (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-expt (base :: , power :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-sin (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-cos (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-tan (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-asin (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-acos (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-single-float-atan (x :: ) => (z :: ); /// DOUBLE-FLOAT define function raw-df-op (op :: , rx :: <&raw-double-float>, ry :: <&raw-double-float>) => (z :: <&raw-double-float>) let x :: = ^raw-object-value(rx); let y :: = ^raw-object-value(ry); make-raw-literal(op(x, y)) end function raw-df-op; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-as-raw (x :: ) => (r :: ) ^%double-float-data(x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-raw-as-double-float (r :: ) => (x :: ) make-compile-time-literal(^raw-object-value(r)) end; /// NOTE: The Dylan library expects this primitive to round towards zero (i.e., truncate) define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-as-integer (f :: ) => (i :: ) make-raw-literal(round(^raw-object-value(f))) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-integer-as-double-float (x :: ) => (z :: ) make-raw-literal(as(, ^raw-object-value(x))) end; define side-effect-free stateless dynamic-extent &primitive primitive-double-float-as-double-integer (f :: ) => (low :: , high :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-integer-as-double-float (low :: , high :: ) => (f :: ); define side-effect-free stateless dynamic-extent &primitive primitive-cast-double-float-as-machine-words (f :: ) => (low :: , high :: ); define side-effect-free stateless dynamic-extent &primitive primitive-cast-machine-words-as-double-float (low :: , high :: ) => (f :: ); define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-negate (x :: ) => (negated :: ) let x :: = ^raw-object-value(x); make-raw-literal(0.0d0 - x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-add (x :: , y :: ) => (sum :: ) raw-df-op(\+, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-subtract (x :: , y :: ) => (difference :: ) raw-df-op(\-, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-multiply (x :: , y :: ) => (product :: ) raw-df-op(\*, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-divide (x :: , y :: ) => (ratio :: ) raw-df-op(\/, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-equals? (x :: , y :: ) => (equal? :: ) raw-df-op(\=, x, y) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-less-than? (x :: , y :: ) => (less? :: ) raw-df-op(\<, x, y) end; define side-effect-free stateless dynamic-extent &primitive primitive-double-float-sqrt (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-log (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-exp (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-expt (base :: , power :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-sin (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-cos (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-tan (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-asin (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-acos (x :: ) => (z :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-atan (x :: ) => (z :: ); /// FLOAT CONVERSIONS define side-effect-free stateless dynamic-extent &primitive-and-override primitive-single-float-as-double (s :: ) => (d :: ) make-raw-literal(as(, ^raw-object-value(s))) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-double-float-as-single (d :: ) => (s :: ) make-raw-literal(as(, ^raw-object-value(d))) end; /// FLOAT CLASSIFICATION (e.g. nan, infinity, zero, normal) define side-effect-free stateless dynamic-extent &primitive primitive-single-float-class (x :: ) => (class :: ); define side-effect-free stateless dynamic-extent &primitive primitive-double-float-class (x :: ) => (class :: ); // eof