4

この質問に対する正確な答えが見つからなかったので、ここに投稿します。整数の範囲がある場合、この範囲の「N」個の数値を対数距離で計算したいです。

これは、等しい「非対数」距離 (多かれ少なかれ) で数値を見つけるためのサンプル コードです。

const int N = 100; // total no of sizes to generate
const int LOW = 10; // range low-bound
const int HIGH = 1000000; // range upper-bound
int SIZES[N];
int GAP = (HIGH-LOW)/N;
SIZES[0] = LOW + GAP;
for(int i=1; i<N; ++i)
{
   SIZES[i] = SIZES[i-1] + GAP;
}

ただし、「対数」距離でこの範囲内の「N」個の数値を見つけたいです。

4

2 に答える 2

10

あなたが本当に欲しいのは対数スケールだとしか思えません。

その場合、定数を追加する代わりに、定数GAPを掛けますFACTORLOW*FACTOR^N=HIGHFACTOR は、 の方程式を解くことによって見つけることができますFACTOR

解は HIGH/LOW の N 乗根であることがわかります。

于 2013-07-16T10:56:54.900 に答える
2

この目的のために関数logと関数を使用できます。exp丸めの問題を回避するには、doubleデータ型を操作することをお勧めします。

関数logは自然対数を返しますが、数値以外の他の基数e( log10() など) を使用しても同じ結果が得られます。これは、特定の間隔で対数距離が等しい一意の数値セットが 1 つしかないためです。

#include <math.h>       /* log & exp & round */

const double N = 100; // total no of sizes to generate
const double LOW = 10; // range low-bound
const double HIGH = 1000000; // range upper-bound
double SIZES[N];
double GAP = (log(HIGH)-log(LOW))/N;
SIZES[0] = LOW*exp(GAP);
for(int i=1; i<N; ++i)
{
   SIZES[i] = (SIZES[i-1]*exp(GAP));
}

//rounding
for(int i=1; i<N; ++i)
{
   SIZES[i] = round(SIZES[i]);
}
于 2013-07-16T11:00:08.893 に答える