From 31508ee732a1d9368c76468f4217ca463a9b18fc Mon Sep 17 00:00:00 2001 From: johnoel Date: Wed, 25 Nov 2015 11:13:38 -1000 Subject: [PATCH] Cleanups for mfexp and added tests. --- src/linad99/mfexp.cpp | 101 +++++++++++++------------------ src/linad99/mfexpcon.cpp | 104 +++++++++++++------------------- tests/gtests/test_dvariable.cpp | 11 ++++ 3 files changed, 95 insertions(+), 121 deletions(-) diff --git a/src/linad99/mfexp.cpp b/src/linad99/mfexp.cpp index f0f6a88c5..112972a93 100644 --- a/src/linad99/mfexp.cpp +++ b/src/linad99/mfexp.cpp @@ -1,70 +1,51 @@ /* - * $Id$ - * - * Author: David Fournier - * Copyright (c) 2008-2012 Regents of the University of California - */ -/** - \file - Robust exponential functions for variable scalar objects. - */ -#include +\file Robust exponential functions for variable scalar objects. -/** - Robust exponential function for variable argument > 60 or < -60. - Prevents overflow and underflow for arguments outside of the domain - of exp(). - (Note: \f$e^{60} > 10^{26}\f$.) - \param x dvariable exponent. - \return \f$\left\{\begin{array} {r@{\quad:\quad}l} - x > 60 & e^{60}\frac{(1+2(x-60))}{1+x-60}\\ - x < 60 & e^{-60}\frac{(1-x-60)}{1+2(-x-60)}\\ - {\rm else} & e^x - \end{array}\right.\f$ - \ingroup misc - */ -dvariable mfexp(const prevariable& x) - { - double b=60; - if (x<=b && x>=-b) - { - return exp(x); - } - else if (x>b) - { - return exp(b)*(1.+2.*(x-b))/(1.+x-b); - } - else - { - return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); - } - } +Author: David Fournier +Copyright (c) 2008-2015 Regents of the University of California +*/ +#include /** - Robust exponential function for variable argument with user - specified domain bound. - Prevents overflow and underflow for arguments outside of the domain - \param x dvariable exponent. - \param b double user specified function domain bound. - \return \f$\left\{\begin{array} {r@{\quad:\quad}l} +Robust exponential function for variable argument with user +specified domain bound. +Prevents overflow and underflow for arguments outside of the domain +\param x dvariable exponent. +\param b double user specified function domain bound. +\return \f$\left\{\begin{array} {r@{\quad:\quad}l} x > b & e^b\frac{(1+2(x-b))}{1+x-b}\\ x < b & e^{-b}\frac{(1-x-b)}{1+2(-x-b)}\\ {\rm else} & e^x - \end{array}\right.\f$ - \ingroup misc - */ + \end{array}\right.\f$ +\ingroup misc +*/ dvariable mfexp(const prevariable& x, double b) +{ + if (x > b) + { + return exp(b)*(1.+2.*(x-b))/(1.+x-b); + } + else if (x < -b) { - if (x<=b && x>=-b) - { - return exp(x); - } - else if (x>b) - { - return exp(b)*(1.+2.*(x-b))/(1.+x-b); - } - else - { - return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); - } + return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); } + return exp(x); +} +/** +Robust exponential function for variable argument > 60 or < -60. +Prevents overflow and underflow for arguments outside of the domain +of exp(). +(Note: \f$e^{60} > 10^{26}\f$.) +\param x dvariable exponent. +\return \f$\left\{\begin{array} {r@{\quad:\quad}l} + x > 60 & e^{60}\frac{(1+2(x-60))}{1+x-60}\\ + x < 60 & e^{-60}\frac{(1-x-60)}{1+2(-x-60)}\\ + {\rm else} & e^x + \end{array}\right.\f$ +\ingroup misc +*/ +dvariable mfexp(const prevariable& x) +{ + double b = 60; + return mfexp(x, b); +} diff --git a/src/linad99/mfexpcon.cpp b/src/linad99/mfexpcon.cpp index c830f3e3a..5df13e32e 100644 --- a/src/linad99/mfexpcon.cpp +++ b/src/linad99/mfexpcon.cpp @@ -1,70 +1,52 @@ /* - * $Id$ - * - * Author: David Fournier - * Copyright (c) 2008-2012 Regents of the University of California - */ -/** - * \file - Robust exponential functions for constant scalar objects. - */ -#include +\file Robust exponential functions for constant scalar objects. -/** - Robust exponential function for constant argument > 60 or < -60. - Prevents overflow and underflow for arguments outside of the domain - of exp(). - (Note: \f$e^{60} > 10^{26}\f$.) - \param x exponent. - \return \f$\left\{\begin{array} {r@{\quad:\quad}l} - x > 60 & e^{60}\frac{(1+2(x-60))}{1+x-60}\\ - x < 60 & e^{-60}\frac{(1-x-60)}{1+2(-x-60)}\\ - {\rm else} & e^x - \end{array}\right.\f$ - \ingroup misc - */ - double mfexp(double x) - { - double b = 60; - if (x<=b && x>=-b) - { - return exp(x); - } - else if (x>b) - { - return exp(b)*(1.+2.*(x-b))/(1.+x-b); - } - else - { - return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); - } - } +Author: David Fournier +Copyright (c) 2008-2015 Regents of the University of California +*/ +#include /** - Robust exponential function for constant argument with user - specified domain bound. - Prevents overflow and underflow for arguments outside of the domain - \param x exponent. - \param b ouble user specified function domain bound. - \return \f$\left\{\begin{array} {r@{\quad:\quad}l} +Robust exponential function for constant argument with user +specified domain bound. +Prevents overflow and underflow for arguments outside of the domain +\param x exponent. +\param b ouble user specified function domain bound. +\return \f$\left\{\begin{array} {r@{\quad:\quad}l} x > b & e^b\frac{(1+2(x-b))}{1+x-b}\\ x < b & e^{-b}\frac{(1-x-b)}{1+2(-x-b)}\\ {\rm else} & e^x - \end{array}\right.\f$ - \ingroup misc - */ - double mfexp(double x,double b) + \end{array}\right.\f$ +\ingroup misc +*/ +double mfexp(double x, double b) +{ + if (x > b) + { + return exp(b)*(1.+2.*(x-b))/(1.+x-b); + } + else if (x < -b) { - if (x<=b && x>=-b) - { - return exp(x); - } - else if (x>b) - { - return exp(b)*(1.+2.*(x-b))/(1.+x-b); - } - else - { - return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); - } + return exp(-b)*(1.-x-b)/(1.+2.*(-x-b)); } + return exp(x); +} +/** +Robust exponential function for constant argument > 60 or < -60. +Prevents overflow and underflow for arguments outside of the domain +of exp(). +(Note: \f$e^{60} > 10^{26}\f$.) +\param x exponent. +\return \f$\left\{\begin{array} {r@{\quad:\quad}l} + x > 60 & e^{60}\frac{(1+2(x-60))}{1+x-60}\\ + x < 60 & e^{-60}\frac{(1-x-60)}{1+2(-x-60)}\\ + {\rm else} & e^x + \end{array}\right.\f$ +\ingroup misc +*/ +double mfexp(double x) +{ + double b = 60; + return mfexp(x, b); +} + diff --git a/tests/gtests/test_dvariable.cpp b/tests/gtests/test_dvariable.cpp index f1fac775f..b67d686c5 100644 --- a/tests/gtests/test_dvariable.cpp +++ b/tests/gtests/test_dvariable.cpp @@ -102,6 +102,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_TRUE(result > ::exp(60)); } { double input = -100; @@ -111,6 +112,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_TRUE(result < ::exp(-60)); } { double input = 60; @@ -120,6 +122,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_DOUBLE_EQ(result, ::exp(60)); } { double input = -60; @@ -129,6 +132,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_DOUBLE_EQ(result, ::exp(-60)); } { double input = 61; @@ -138,6 +142,8 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_TRUE(result > ::exp(60)); + ASSERT_TRUE(result < ::exp(61)); } { double input = -61; @@ -147,6 +153,8 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_TRUE(result < ::exp(-60)); + ASSERT_TRUE(result > ::exp(-61)); } { double input = 10; @@ -156,6 +164,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_DOUBLE_EQ(result, ::exp(10)); } { double input = -10; @@ -165,6 +174,7 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_DOUBLE_EQ(result, ::exp(-10)); } { double input = 0; @@ -174,5 +184,6 @@ TEST_F(test_dvariable, mfexp) dvariable vresult = mfexp(vinput); ASSERT_DOUBLE_EQ(result, value(vresult)); + ASSERT_DOUBLE_EQ(result, ::exp(0)); } }