diff options
author | Robin Gareus <robin@gareus.org> | 2015-05-02 04:16:32 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-05-02 04:19:54 +0200 |
commit | 8f333acb8033318700134e9ae8fe05bc2173d232 (patch) | |
tree | 0dec654c37adb69112b5543e00f1c192f01b126c /libs | |
parent | ce259edbcdd4c9a2cd8f2a5daa8b158dd9afc928 (diff) |
log(0) - who would have guessed.
marginal improvement on x86_64 for zero, 5-10% for tiny numbers;
100% time improvement (half the time) on i686 with zero.
#/bin/sh
g++ -x c++ -O3 -ffast-math -o /tmp/a.out - << EOF
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <limits>
static inline float accurate_coefficient_to_dB (float coeff) {
#if 1 // try me
if (coeff < 1e-15) return -std::numeric_limits<float>::infinity();
#endif
return 20.0f * log10f (coeff);
}
int main (int argc, char **argv) {
long long int i;
float f = 0;
if (argc < 3) return -1;
long long int end = atoll (argv[1]);
for (i = 0; i < end; ++i) {
f += accurate_coefficient_to_dB (atof (argv[2]));
}
printf ("%f\n",f);
return 0;
}
EOF
time /tmp/a.out 100000000000 0.0
time /tmp/a.out 100000000000 0.0
time /tmp/a.out 100000000000 0.0
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/dB.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/libs/ardour/ardour/dB.h b/libs/ardour/ardour/dB.h index 0a9c71ebf4..1a4ed983ab 100644 --- a/libs/ardour/ardour/dB.h +++ b/libs/ardour/ardour/dB.h @@ -20,6 +20,7 @@ #ifndef __ardour_dB_h__ #define __ardour_dB_h__ +#include <limits> #include "pbd/fastlog.h" #define GAIN_COEFF_ZERO 0.f @@ -35,6 +36,7 @@ static inline float fast_coefficient_to_dB (float coeff) { } static inline float accurate_coefficient_to_dB (float coeff) { + if (coeff < 1e-15) return -std::numeric_limits<float>::infinity(); return 20.0f * log10f (coeff); } |