LoginSignup
0
0

STM32L010を使い、ざっくり1000で割る(あまり正確では、ない)(1000の割り算)

Last updated at Posted at 2022-07-05

x Mbed2
x 軽量高速化

目的
大きくなりすぎた桁をざっくり減らす

o_con561.jpg

計算式




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
}



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0