数式が導くアルゴリズムの取数位
2515 ワード
整数を指定すると、893243のような前のnビットの数字を取り、前の4ビット、すなわち8932を取ります.
2つの一般的なアルゴリズムと1つの対数アルゴリズムを与えた.
一般的なアルゴリズム:上位4ビットをとるため、10000未満であれば直接出力、10000以上であれば10000
ループ判定でよい.
対数アルゴリズム: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であると仮定する
中にはlinuxのsys/timeが使用されています.h両者の間の効率差を測定するために使用され、付:
double floor(double);floor(123.34)が123.00の場合、小数部を切り捨てる
int gettimeofday(struct timeval*tv, struct timezone *tz);
clock(void)関数より正確で微妙です.さらに正確にするにはrdtsc命令をクロックサイクルに使用する必要がある場合があります.
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
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命令をクロックサイクルに使用する必要がある場合があります.