[Insight-developers] Numeric Constants

Tom Vercauteren tom.vercauteren at gmail.com
Thu Aug 6 11:21:07 EDT 2009


Hi Brad,

Moving these mathematical constants to a more visible place sounds
good to me. However, handling floating point constants in c++ is a
pain. For example, the following code is not standard and won't be
usable on several systems (mac gcc 4.0 at least):

class No_Good {
  static double const d = 1.0;
};

I guess that's why boost chose to implement these constants as
template functions:
http://www.boost.org/doc/libs/1_39_0/libs/math/doc/sf_and_dist/html/math_toolkit/toolkit/internals1/constants.html

The other option is to decouple the definition and declaration as done
in vnl  (with some ugly macro):

class Now_Better
{
    static double const d;
};

double const Now_Better::d = 1.0;

More information can be found here:
http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class

No matter the implementation, I would definitely vote for replacing
the current hard-coded values by a common thing such as vnl_math::pi,
itk::Math::pi, or  itk::Math::pi<double>().

My two cents,
Tom

On Thu, Aug 6, 2009 at 16:40, Bradley Lowekamp<blowekamp at mail.nih.gov> wrote:
> Hello,
>
>        I was looking at:
>
> BasicFilters/itkBilateralImageFilter.txx:  rangeGaussianDenom =
> m_RangeSigma*vcl_sqrt(2.0*3.1415927);
>
> It took me a little bit to figure out that we most likely should be using
> vnl_math::pi, along with their "e and all that". I do wonder if these
> constants were in itk::Math and in doxygen if it would help with increased
> usage.
>
> So I began greping in the "Code" directory and came up with the following:
>
> grep -r 3.1415 *
> BasicFilters/itkBilateralImageFilter.txx:  rangeGaussianDenom =
> m_RangeSigma*vcl_sqrt(2.0*3.1415927);
> BasicFilters/itkVectorGradientMagnitudeImageFilter.txx:  const double dpi =
> 3.14159265358979323846;
> Common/itkGaussianDerivativeSpatialFunction.txx:    prefixDenom *=
> 2*vcl_pow( 2 * 3.1415927, VImageDimension / 2.0);
> Common/itkMersenneTwisterRandomVariateGenerator.h:  double phi = 2.0 *
> 3.14159265358979323846264338328
> Numerics/itkCumulativeGaussianOptimizer.cxx:  m_ComputedAmplitude =  sum /
> (m_ComputedStandardDeviation * vcl_sqrt(2*3.14159265));
>
> grep -r 0.707 *
> BasicFilters/itkBSplineResampleImageFilterBase.txx:      m_G[0]  =
>  0.707107;
>
> grep -r 1.414 *
> Numerics/Statistics/itkGaussianDistribution.cxx:    dq  = 0.5e+0 * vnl_erfc(
> dx / 1.414213562373095e+0 ) - dp;
> Review/Statistics/itkGaussianDistribution.cxx:    dq  = 0.5e+0 * vnl_erfc(
> dx / 1.414213562373095e+0 ) - dp;
>
> grep -r vnl_math:: * | wc
>      69     571    7652
>
> Well I guess that is almost 90% usage of the numeric constants, so its not
> bad at all.
>
> I'll work on a patch tonight, and likely commit something tomorrow if no one
> sees a problem with this.
>
> Brad
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
>


More information about the Insight-developers mailing list