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:
Robin Gareus
2015-05-02 04:16:32 +02:00
parent ce259edbcd
commit 8f333acb80

View File

@@ -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);
}