2017-02-20 11 views
1

私のプログラムでは、多くの時間呼ばれている関数fmod()のため、パフォーマンスが低下しています。 %として書かれたCの整数mod、++):"fmod()"を整数 "mod()"に置き換える方法

double a,b,d; 
    a = 10 * sqrt(2); 
    b = PI; 
    time_t result; 

    result = time(NULL); 
    printf("Time fmod: [%s]\n", asctime(localtime(&result))); 

    for (int i = 0;i < 1000000000; i++) { 
    d = fmod(a,b); 
    } 
    result = time(NULL); 
    printf("Time fmod: [%s]\n", asctime(localtime(&result))); 

    result = time(NULL); 
    printf("Time integer: [%s]\n", asctime(localtime(&result))); 
    for (int i = 0;i < 1000000000; i++) { 
    d = ((double)((int)(1000000*a) % (int)(1000000*b)))/1000000; 
    } 
    result = time(NULL); 
    printf("Time integer: [%s]\n", asctime(localtime(&result))); 

(私はaが負の場合、いくつかのより多くのニーズが行われるように、知っているが、少なくとも正の数のために、それは良いパフォーマンスの向上を与える18秒の代わりに、 110)、しかし明らかなキャッチがあります:私が与えた例では、私の数字にはもう小数点がないことを確かめるために、乗算の任意の数として1000000を使用しました。

数字の最後の小数点以下のサイズを与える数学ライブラリには、ある種の関数がありますか? (パフォーマンスすぎ:-)を減少させていないうまくいけば機能)この程度

+1

小数点以下の桁数は、浮動小数点数の繰り返しになります。小数点以下の桁数を知る方法はありません。 – Barmar

+0

制限要因は、浮動小数点数の実際の数字だけではなく、 'std :: numeric_limits :: digits10'に基づいている可能性が高いです。 – Drax

答えて

0

。一方、私は私の問題に他のいくつかの解決策を見つけた:fmod()が本当にあるようです単純に#define fmod(a,b) ((a) - ((int)((a)/(b))) * (b))を作成するか、インライン関数を作成してこの計算を行うと、動作が大幅に増加します。

0

方法:

if (a > 0) 
    while (a > b) a -= b; 
else 
    while (a < -b) a += b; 
+0

これは良い考えではありません:私はパフォーマンスを向上させたいと思いますが、あなたのアルゴリズムは正しいように見えますが、ループを追加するとパフォーマンスが低下します( 'a = 1000000'と' b = 0.000001'を想像してください)。 – Dominique

関連する問題