diff model/calc.h @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/model/calc.h	Fri May 20 15:19:45 2011 +0100
@@ -0,0 +1,60 @@
+/*
+    calc.h
+    ======
+
+    definitions to make model source portable across calculation type.
+    Used fixed point representation for real numbers in integer machines.
+
+    Type names:
+	DataType - type used to pass results between modules
+		   EG. usually a short.
+	StoreType - type used to store an intermediate result within a module
+	ScalarType - type used to store fixed-point multipliers
+
+    Integer arithmetic:
+
+	SCALE - convert to fixed point
+	SCALAR- float to fixed to fixed point multiplier
+		(Used to create a value for a ScalarType).
+	DESCALE - convert back to int (opposite of SCALE).
+
+	UNSCALE - convert fixed point back to float.
+
+	Use int instead float to get fixed point arithmetic, but shift
+	numbers to preserve the significant digits, EG for multiplication:
+		use SCALAR on one operand (which will then be a ScalarType)
+		use DESCALE on the result
+*/
+
+#if 1                   /* Switch to convert whole model to floating point */
+#define FLOAT float     /* version (default uses integer arithmetic)       */
+#endif
+
+#ifdef  DSP32
+#define FLOAT float
+#endif
+
+
+#ifdef  FLOAT
+
+typedef FLOAT ScalarType ;
+typedef FLOAT  StoreType ;
+typedef FLOAT   DataType ;
+
+#define   SCALE( _num ) (          _num                         )
+#define  SCALAR( _num ) (          _num                         )
+#define DESCALE( _num ) (          _num                         )
+#define UNSCALE( _num ) (          _num                         )
+
+#else
+
+typedef long ScalarType ;
+typedef long  StoreType ;
+typedef short  DataType ;
+
+#define   SCALE( _num ) ( (long) ( _num )                << 16l         )
+#define  SCALAR( _num ) (        ( _num ) *         ( 1l << 16l ) + 0.5 )
+#define DESCALE( _num ) ( (long) ( _num )                >> 16l         )
+#define UNSCALE( _num ) (        ( _num ) / (float) ( 1l << 16l )       )
+
+#endif