Go forward to Bit.
Go backward to Complex.
Go up to Top.
Fixed precision numbers
***********************
Classes `Fix16', `Fix24', `Fix32', and `Fix48' support operations on
16, 24, 32, or 48 bit quantities that are considered as real numbers in
the range [-1, +1). Such numbers are often encountered in digital
signal processing applications. The classes may be be used in isolation
or together. Class `Fix32' operations are entirely self-contained.
Class `Fix16' operations are self-contained except that the
multiplication operation `Fix16 * Fix16' returns a `Fix32'. `Fix24' and
`Fix48' are similarly related.
The standard arithmetic and relational operations are supported
(`=', `+', `-', `*', `/', `<<', `>>', `+=', `-=', `*=', `/=', `<<=',
`>>=', `==', `!=', `<', `<=', `>', `>='). All operations include
provisions for special handling in cases where the result exceeds +/-
1.0. There are two cases that may be handled separately: "overflow"
where the results of addition and subtraction operations go out of
range, and all other "range errors" in which resulting values go
off-scale (as with division operations, and assignment or
initialization with off-scale values). In signal processing
applications, it is often useful to handle these two cases differently.
Handlers take one argument, a reference to the integer mantissa of the
offending value, which may then be manipulated. In cases of overflow,
this value is the result of the (integer) arithmetic computation on the
mantissa; in others it is a fully saturated (i.e., most positive or
most negative) value. Handling may be reset to any of several provided
functions or any other user-defined function via `set_overflow_handler'
and `set_range_error_handler'. The provided functions for `Fix16' are
as follows (corresponding functions are also supported for the others).
`Fix16_overflow_saturate'
The default overflow handler. Results are "saturated": positive
results are set to the largest representable value (binary
0.111111...), and negative values to -1.0.
`Fix16_ignore'
Performs no action. For overflow, this will allow addition and
subtraction operations to "wrap around" in the same manner as
integer arithmetic, and for saturation, will leave values
saturated.
`Fix16_overflow_warning_saturate'
Prints a warning message on standard error, then saturates the
results.
`Fix16_warning'
The default range_error handler. Prints a warning message on
standard error; otherwise leaving the argument unmodified.
`Fix16_abort'
prints an error message on standard error, then aborts execution.
In addition to arithmetic operations, the following are provided:
`Fix16 a = 0.5;'
Constructs fixed precision objects from double precision values.
Attempting to initialize to a value outside the range invokes the
range_error handler, except, as a convenience, initialization to
1.0 sets the variable to the most positive representable value
(binary 0.1111111...) without invoking the handler.
`short& mantissa(a); long& mantissa(b);'
return a * pow(2, 15) or b * pow(2, 31) as an integer. These are
returned by reference, to enable "manual" data manipulation.
`double value(a); double value(b);'
return a or b as floating point numbers.