Absolute value of fi
object
c = abs(a)
c = abs(a,T)
c = abs(a,F)
c = abs(a,T,F)
c = abs(a)
returns the absolute value of fi
object a
with
the same numerictype
object as a
.
Intermediate quantities are calculated using the fimath
associated
with a
. The output fi
object c
has
the same local fimath as a
.
c = abs(a,T)
returns a fi
object
with a value equal to the absolute value of a
and numerictype
object T
.
Intermediate quantities are calculated using the fimath
associated
with a
and the output fi
object c
has
the same local fimath as a
. See Data Type Propagation Rules.
c = abs(a,F)
returns a fi
object
with a value equal to the absolute value of a
and
the same numerictype
object as a
.
Intermediate quantities are calculated using the fimath
object F
.
The output fi
object c
has no
local fimath.
c = abs(a,T,F)
returns a fi
object
with a value equal to the absolute value of a
and
the numerictype
object T
. Intermediate
quantities are calculated using the fimath
object F
.
The output fi
object c
has no
local fimath. See Data Type Propagation Rules.
When the Signedness
of the input numerictype
object T
is Auto
,
the abs
function always returns an Unsigned
fi
object.
abs
only supports fi
objects
with [Slope Bias] scaling when the bias is zero and the fractional
slope is one. abs
does not support complex fi
objects
of data type Boolean
.
When the object a
is real and has a signed
data type, the absolute value of the most negative value is problematic
since it is not representable. In this case, the absolute value saturates
to the most positive value representable by the data type if the OverflowAction
property
is set to saturate
. If OverflowAction
is wrap
,
the absolute value of the most negative value has no effect.
For syntaxes for which you specify a numerictype
object T
,
the abs
function follows the data type propagation
rules listed in the following table. In general, these rules can be
summarized as “floating-point data types are propagated.”
This allows you to write code that can be used with both fixed-point
and floating-point inputs.
Data Type of Input fi Object a | Data Type of numerictype object T | Data Type of Output c |
---|---|---|
|
| Data type of |
|
|
|
|
|
|
|
|
|
Any |
|
|
Any |
|
|
The following example shows the difference between the absolute
value results for the most negative value representable by a signed
data type when OverflowAction
is saturate
or wrap
.
P = fipref('NumericTypeDisplay','full',... 'FimathDisplay','full'); a = fi(-128) a = -128 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 8 abs(a) ans = 127.9961 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 8 a.OverflowAction = 'Wrap' a = -128 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 8 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision abs(a) ans = -128 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 8 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision
The following example shows the difference between the absolute
value results for complex and real fi
inputs that
have the most negative value representable by a signed data type when OverflowAction
is wrap
.
re = fi(-1,1,16,15) re = -1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15 im = fi(0,1,16,15) im = 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15 a = complex(re,im) a = -1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15 abs(a,re.numerictype,fimath('OverflowAction','Wrap')) ans = 1.0000 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15 abs(re,re.numerictype,fimath('OverflowAction','Wrap')) ans = -1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15
The following example shows how to specify numerictype
and fimath
objects
as optional arguments to control the result of the abs
function
for real inputs. When you specify a fimath
object
as an argument, that fimath
object is used to compute
intermediate quantities, and the resulting fi
object
has no local fimath.
a = fi(-1,1,6,5,'OverflowAction','Wrap') a = -1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 6 FractionLength: 5 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision abs(a) ans = -1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 6 FractionLength: 5 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision f = fimath('OverflowAction','Saturate') f = RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision abs(a,f) ans = 0.9688 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 6 FractionLength: 5 t = numerictype(a.numerictype, 'Signed', false) t = DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 6 FractionLength: 5 abs(a,t,f) ans = 1 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 6 FractionLength: 5
The following example shows how to specify numerictype
and fimath
objects
as optional arguments to control the result of the abs
function
for complex inputs.
a = fi(-1-i,1,16,15,'OverflowAction','Wrap') a = -1.0000 - 1.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision t = numerictype(a.numerictype,'Signed',false) t = DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 16 FractionLength: 15 abs(a,t) ans = 1.4142 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 16 FractionLength: 15 RoundingMethod: Nearest OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision f = fimath('OverflowAction','Saturate','SumMode',... 'KeepLSB','SumWordLength',a.WordLength,... 'ProductMode','specifyprecision',... 'ProductWordLength',a.WordLength,... 'ProductFractionLength',a.FractionLength) f = RoundingMethod: Nearest OverflowAction: Saturate ProductMode: SpecifyPrecision ProductWordLength: 16 ProductFractionLength: 15 SumMode: KeepLSB SumWordLength: 16 CastBeforeSum: true abs(a,t,f) ans = 1.4142 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 16 FractionLength: 15
The absolute value y
of a real input a
is
defined as follows:
y
= a
if a
>=
0
y
= -a
if a
<
0
The absolute value y
of a complex input a
is
related to its real and imaginary parts as follows:
y
= sqrt(real(a)*real(a) + imag(a)*imag(a))
The abs
function computes the absolute value
of complex inputs as follows:
Calculate the real and imaginary parts of a
using
the following equations:
re = real(a)
im
= imag(a)
Compute the squares of re
and im
using
one of the following objects:
The fimath
object F
if F
is
specified as an argument.
The fimath
associated with a
if F
is
not specified as an argument.
Cast the squares of re
and im
to
unsigned types if the input is signed.
Add the squares of re
and im
using
one of the following objects:
The fimath
object F
if F
is
specified as an argument.
The fimath
object associated with a
if F
is
not specified as an argument.
Compute the square root of the sum computed in step
four using the sqrt
function with the following
additional arguments:
The numerictype
object T
if T
is
specified, or the numerictype
object of a
otherwise.
The fimath
object F
if F
is
specified, or the fimath
object associated with a
otherwise.
Step three prevents the sum of the squares of the real and imaginary
components from being negative. This is important because if either re
or im
has
the maximum negative value and the OverflowAction
property
is set to wrap
then an error will occur when taking
the square root in step five.