x Mbed2
x 軽量高速化
目的
大きくなりすぎた桁をざっくり減らす
計算式
1000/15=66
66*1.5=100
100,000/1024=97.65625
97.65625*1.024=100
97.65625*1.0 =97.65625
97.65625*0.024=2.234375
97.65625+2.234375=100
100,000*1.024=102.400
102.400/1024=100
前提
1 1000 01 10 1010 0000. (100,000)
1 1000 01.10 1010 0000 (97.65625) 右10ビットシフト
1 1000 0110 1010 0000 (100,000) 97.65625
1001 0110 0000 ( 2,400) 2.34375
-----------------------------------------
1 1001 0000 0000 0000 (102,400) 100.0
1 1000 0110 1010 0000 (100,000) 97.65625
1001 1000 1001 ( 2,441) 2
-----------------------------------------
1 1001 0000 0010 1001 (102,441) 100
00 0001 1001 ( 25) 0.024
00 0001 1000 ( 24) 0.024
97.65625 * 0.24 = 23.4375
2,457,600 / 1024 = 2400
100,000 * 24.576 = 2,457,600
2,457,600/1024=2400
100,000 * 25 = 2,500,000
2,500,000/1024=2,441
((n + ((n * 25)>>10))>>10)
プログラム
//B_DIV1000_010_1
#include "mbed.h"
RawSerial pc(PA_2, PA_3); //010
//1000の割り算 だいたい正しい。
#define DIV1000(n) ((n+((n*25)>>10))>>10)
//10の割り算 0から9999までは、正しい。
#define DIV10(n) (((n*409)+((n*154)>>8))>>12)
int main() {
int d;
char data[15];
pc.printf("START\r\n");
while(1){
d=123456;
d=DIV1000(d);
data[4] = 0;
data[3] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10)
d = DIV10(d);
data[2] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10)
d = DIV10(d);
data[1] = '0' + ( d - (DIV10(d) * 10) ); // '0'+(d%10)
data[0] = '0' + DIV10(d); // '0'+(d/10)
pc.printf(data);
pc.printf("\r\n");
wait_ms(1000);
}//while
}//main
テスト
//1000の割り算 だいたい正しい。
#define DIV1000(n) ((n+((n*25)>>10))>>10)
#include <stdio.h>
int main(void){
int n01 = 0;
for(int ii = 0;ii <= 400000;ii=ii+1000){
printf("[%d]=",ii);
n01=DIV1000(ii);
//n01=((ii+((ii*25)>>10))>>10);
printf("[%d]\r\n",n01);
}//for
}