\(\newcommand{\W}[1]{ \; #1 \; }\) \(\newcommand{\R}[1]{ {\rm #1} }\) \(\newcommand{\B}[1]{ {\bf #1} }\) \(\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }\) \(\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }\) \(\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }\) \(\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }\)
zdouble¶
View page sourcezdouble: An AD Base Type With Absolute Zero¶
Deprecated 2015-09-26¶
Use the function azmul instead.
Absolute Zero¶
The zdouble
class acts like the double
type
with the added property that zero times any value is zero.
This includes zero time nan and zero times infinity.
In addition, zero divided by any value and any value times zero
are also zero.
Syntax¶
Constructor and Assignment¶
zdouble z
zdouble z
( x
)zdouble z
( i
)were i is a size_t
or long or int
,
x is a double
or zdouble
,
and op is =
or +=
or -=
or *=
or /=-
.
Comparison Operators¶
where b is a bool
object,
z is a zdouble
object,
x is a double
or zdouble
object, and
op is ==
, !=
, <=
, >=
,
<
or >
.
Arithmetic Operators¶
where z1 , z2 are zdouble
objects,
x is a double
or zdouble
object, and
op is +
, -
, *
or /
.
Standard Math¶
pow
( z1 , z2 )where z1 , z2 , z3 are zdouble
objects and
fun is a unary_standard_math function.
Nan¶
There is a specialization of nan so that
z2
= nan (z1
)
returns ‘not a number’ when z1 has type zdouble
.
Note that this template function needs to be specialized because
zdouble
(0.0) ==zdouble
(0.0) /zdouble
(0.0)
Motivation¶
General¶
Often during computing (and more so in parallel computing) alternative values for an expression are computed and one of the alternatives is chosen using some boolean variable. This is often represented by
result = flag * value_if_true + (1
-
flag ) * value_if_false
where flag is one for true and zero for false.
This representation does not work for double
when the value
being multiplied by zero is +inf
, -inf
, or nan
.
CppAD¶
In CppAD one can use conditional expressions to achieve the representation
result = flag * value_if_true + (1
-
flag ) * value_if_false
This works fine except when there are
multiple levels of AD ; e.g.,
when using AD< AD<double> >
.
In this case the corresponding AD function objects have type
ADFun< AD<double> > .
When these AD function objects compute derivatives using
Reverse mode, the conditional expressions are represented use
zeros to multiply the expression that is not used.
Using AD< AD<zdouble> >
instead of AD< AD<double> >
makes this representation work and fixes the problem.
Base Type Requirements¶
The type zdouble
satisfies all of the CppAD
base type requirements .