summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/dB.h
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-05-02 04:16:32 +0200
committerRobin Gareus <robin@gareus.org>2015-05-02 04:19:54 +0200
commit8f333acb8033318700134e9ae8fe05bc2173d232 (patch)
tree0dec654c37adb69112b5543e00f1c192f01b126c /libs/ardour/ardour/dB.h
parentce259edbcdd4c9a2cd8f2a5daa8b158dd9afc928 (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/ardour/ardour/dB.h')
-rw-r--r--libs/ardour/ardour/dB.h2
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);
}