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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user