Floating Point Constants - Inlining Questions

L

Leslie Sanford

I want to define a set of floating point constants using templates insteand
of macros. I'd like to determine whether these constants are floats or
doubles at compile time. In my header file, I have this:

template<bool DoublePrecision>
struct Constants
{
typedef double SampleType;

static const double pi;
static const double piDoubled;
static const double SampleRateDefault;
static const double DenormalOffset;
};

template<>
struct Constants<false>
{
typedef float SampleType;

static const float pi;
static const float piDoubled;
static const float SampleRateDefault;
static const float DenormalOffset;
};

In my implementation file, I have this

#include "Constants.h"

const double Constants<true>::pi = 3.14159265358979;
const double Constants<true>::piDoubled = Constants<true>::pi * 2.0;
const double Constants<true>::SampleRateDefault = 44100.0;
const double Constants<true>::DenormalOffset = 1.0E-25;

const float Constants<false>::pi = 3.141593f;
const float Constants<false>::piDoubled = 6.283185f;
const float Constants<false>::SampleRateDefault = 44100.0f;
const float Constants<false>::DenormalOffset = 1.0E-25f;

My question is whether the values definined here will ultimately be inlined
by the compiler where they are used. They are definined in one compilation
unit but will be used in other compilation units. Will this prevent them
from being inlined? In other words, will this ultimately be less efficient
than using macros?
 
J

James Kanze

I want to define a set of floating point constants using
templates insteand of macros. I'd like to determine whether
these constants are floats or doubles at compile time. In my
header file, I have this:
template<bool DoublePrecision>
struct Constants
{
typedef double SampleType;

static const double pi;
static const double piDoubled;
static const double SampleRateDefault;
static const double DenormalOffset;
};
template<>
struct Constants<false>
{
typedef float SampleType;

static const float pi;
static const float piDoubled;
static const float SampleRateDefault;
static const float DenormalOffset;
};
In my implementation file, I have this
#include "Constants.h"
const double Constants<true>::pi = 3.14159265358979;
const double Constants<true>::piDoubled = Constants<true>::pi * 2.0;
const double Constants<true>::SampleRateDefault = 44100.0;
const double Constants<true>::DenormalOffset = 1.0E-25;
const float Constants<false>::pi = 3.141593f;
const float Constants<false>::piDoubled = 6.283185f;
const float Constants<false>::SampleRateDefault = 44100.0f;
const float Constants<false>::DenormalOffset = 1.0E-25f;
My question is whether the values definined here will
ultimately be inlined by the compiler where they are used.

What does it mean to "inline" a double. A double is not code.

And of course, what code the compiler generates will depend on
the compiler (and the machine it is generating the code for).
They are definined in one compilation unit but will be used in
other compilation units. Will this prevent them from being
inlined? In other words, will this ultimately be less
efficient than using macros?

The only way to find out is to measure both. And that will only
give you an answer for one particular compiler.

As a general rule, however: the more the compiler knows, the
better it can do its job. Arranging for the constant to be
visible in the translation unit (e.g. by making it the return
value of an inline function) cannot generally hurt, and it may
help for some compilers, on some machines.

I might also add that on a lot of machines, whether you use
float or double, or even if you mix them, makes no difference in
terms of spead. So your best solution might be to just declare
your constants as static doubles (or even long doubles) in a
namespace, and forget the template and the class.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top