数式が導くアルゴリズムの取数位


整数を指定すると、893243のような前のnビットの数字を取り、前の4ビット、すなわち8932を取ります.
2つの一般的なアルゴリズムと1つの対数アルゴリズムを与えた.
一般的なアルゴリズム:上位4ビットをとるため、10000未満であれば直接出力、10000以上であれば10000    double pow( double x, double y );
ループ判定でよい.
対数アルゴリズム:log 10(893243)=log 10(8.93243*10^5)=log 10(8.93243)+5;
0    log10(8.93243) = X
    10^X = 8.93243,
問題は次のようになります.
    1.1つの数を最初の小数点の数にするにはどうすればいいですか?(1000で4桁の数を得るために)
    2.またどのように小数部を得ますか?(私のために
整理して、NUMBERを1つ与えます
    log10(NUMBER) = Y.X
    Y.X - Y = X
10^X=N.UMBERトップ小数点以下の数
そしてNUMBER×1000や10000など、欲しい数桁の数字を取りに来ました.
実はlog 10()自体がこの特徴で、100より大きいと2になります.xxが1000より大きい場合は3.xxxただし、この小数部はこの数の「トップ後帯小数点の数」と結びついており、言い換えれば小数部がわかり、全体情報がわかり、小数->原数情報のフォーマットが固定されており、トップ後帯小数点である.そしてこのフォーマットが固定されているものを処理すればいいです.
以下、nが4であると仮定する
#include<stdio.h>
#include<math.h>
#include<sys/time.h>
int main()
{
    struct timeval tv_begin, tv_end;
    int num,i,k,temp;
    float z;
    printf("input number:");
    scanf("%d",&num);
    k = 4;
    temp = num;
    gettimeofday(&tv_begin, NULL);/*        */
    for(;num>9999;){            
        if(pow(10,k) <= num && pow(10,k+1) > num){
            num = num/(int)pow(10,k-3);
            break;
        }
        k++;
    }
    gettimeofday(&tv_end, NULL);
    printf("way of repetition  %d
",num);     printf("time %d s %d us
",tv_end.tv_sec - tv_begin.tv_sec,tv_end.tv_usec - tv_begin.tv_usec);     // log n     gettimeofday(&tv_begin, NULL);     z = log10(temp);                // 1000 ,     z = z - floor(z);     num = pow(10,z)*1000;     gettimeofday(&tv_end, NULL);     printf("way of log %d
",num);     printf("time %d s %d us
",tv_end.tv_sec - tv_begin.tv_sec,tv_end.tv_usec - tv_begin.tv_usec);     return 0; }

中にはlinuxのsys/timeが使用されています.h両者の間の効率差を測定するために使用され、付:
    double floor(double);floor(123.34)が123.00の場合、小数部を切り捨てる
    int gettimeofday(struct timeval*tv, struct timezone *tz);
struct timeval{
    long int tv_sec; //   
    long int tv_usec; //    
}

clock(void)関数より正確で微妙です.さらに正確にするにはrdtsc命令をクロックサイクルに使用する必要がある場合があります.