私はCをまったく知らないし、誰かのコードを編集しようとしているが、ログからリニアドメインに値を変換しようとしているときに問題がある。例えばログをCでリニアに変換して平均をとる
、すなわち
float A[100];
int i;
for(i=0; i<100; i++)
A[i] = -100;
私は何をしたいことはすべての値の平均を見つけることである(、我々は-100デシベルに等しいログ値の完全である配列Aを持っているとしましょう明確ました-100)ですが、リニアでログドメインではない平均をとることで、つまり
float tmp_avg = 0.0;
float avg;
int count = 0;
for(i=0; i<100; i++) {
tmp_avg += pow(10.0, A[i]/10.0);
count++;
}
avg = 10*log10(tmp_avg/count);
しかし、結果はすべて0です。私が取り組んでいるコードは、これよりはるかに複雑ですが、なぜこれがうまくいかないのか分からないということが明らかなものがあるのだろうかと思っていました。
10 ^( - 100/10)は非常に小さな値(1e-10)であり、フロートとして正確に定義するには小さすぎると考えました。私は代わりにそれをダブルにしようとしましたが、私はまだすべての0の結果を取得します。
ありがとうございます! 、私はlog10の機能については言及がなかったことを信じて、それがなければ
#include <math.h>
:私はプログラムの先頭でのmath.hライブラリを含めるために必要な:
そのコード(またはむしろ、コンパイルするコードのバージョン)[うまく動作](http://ideone.com/GlvTG)。あなたのエラーは別の場所になければなりません。 –
あなたのプログラムはここでうまくいきます - 'avg'は' -100'として出てきます。私は最後の計算で変数名のタイプミスを修正する必要がありましたが、それ以外は問題ありません。 –
オンラインコンパイラを使用したときにうまくいきました。私のデバイスでは動作しない理由はわかりません。おそらく、非常に小さな数値を処理できないような方法で浮動小数点変数を定義するサブルーチンがあります。 – Josiah