30/09/2018, 17:32

Tính LOG cơ số 10

mọi người giúp mình với. mình đang lập trình cho vi điều khiển phải dùng đến hàm log cơ số 10 để tính toán. nhưng mình chỉ dùng hàm log thôi mà khai báo cái thư viện toán thì chiếm nhiều dung lượng của IC wa. nên muốn mọi người giúp tạo hàm log riêng. giúp mình với. thank mọi người! log cơ số 10 tính cho số thực

Mai Anh Dũng viết 19:42 ngày 30/09/2018

nhưng mình chỉ dùng hàm log thôi mà khai báo cái thư viện toán thì chiếm nhiều dung lượng của IC wa

Sao lại chiếm nhiều dung lượng nhỉ? Đạt nghĩ thư viện cũng khá nhỏ?

Thanh Tung viết 19:33 ngày 30/09/2018

Cái này một người bạn của mình yêu cầu làm riêng một hàm log và thấy bạn mình bảo nó chiếm nhiều dung lượng của vi điều khiển quá.

Mai Anh Dũng viết 19:37 ngày 30/09/2018

Dung lượng ở đây là dung lượng gì? Ram hay flash? Bạn đang build C bằng compiler nào? Dùng thư viện nào?

Đạt đang dùng uClibc, size của thư viện này, toàn bộ, có tầm 1.5 MB thôi.

Nguyen Ti viết 19:46 ngày 30/09/2018

chào bạn, mình không biết bạn dùng ngôn ngữ gì để lập trình, nhưng mình nghĩ nếu là lập trình vi điều khiển thì thường là C. Mình chỉ gợi ý giair thuật để bạn tự phát triển thôi chứ đang làm không có thời gian nghiên cứu sâu, sr. Giair thuật của mình giups bạn tính chính xác 3 chữ số, sai chênh lệch nhỏ hơn hoặc bằng 0.1. Bạn dựa vào đó phát triển lên nếu muốn độ chính xác cao hơn. Hy vọng giups được bạn.

  • Gọi số đó là n, bạn chạy vòng lặp vd for (i=0; ;i=i+0.001) (cho step càng nhỏ bạn nhận được kết qủa càng chính xác, đồng nghĩa với việc thời gian tính toán càng lâu, bạn tự xem yêu cầu về mặt thời gian mà tính toán).

  • Với mỗi vòng lặp, bạn lấy 10^i , rồi so sánh với n, nếu nhỏ hơn hoặc bằng 0.1 thì dừng vòng lặp và lấy kết qủa là i(do ta lấy step 0.001 nên sai số có thể nhỏ nhất là 0.1, nếu bạn lấy số lớn hơn 0.1 thì cũng ok, nhưng nếu muốn lấy nhỏ hơn ví dụ như 0.05 thì bạn cần phải lấy step nhỏ hơn, thực nghiệm bạn sẽ thấy)

Thanh Tung viết 19:33 ngày 30/09/2018

bạn mình dùng CCS lập trình cho PIC16. vì phải lập trình nhiều phần khác nhau nữa, nên muốn tiết kiệm dung lượng bộ nhớ flash.

Thanh Tung viết 19:49 ngày 30/09/2018

cảm ơn bạn đá góp ý nha. nhưng mình thấy tính 10^i có vẻ khó lắm. ko biết bạn có cách nào nữa không. giúp mình

Thanh Tung viết 19:46 ngày 30/09/2018

mình cũng bảo bạn mình bảo dùng thư viện. nhưng bảo vì còn phải lập trình thêm nhiều cái nữa. nên ko muốn tốn bộ nhớ vao 1 phép tính LOG

Gió viết 19:38 ngày 30/09/2018

Sử dụng chuỗi logarit thôi.

hàm mylog để tính loga cơ số e. Từ đó có thể tính dễ dàng với cơ số 10

w=(x-1)/(x+1)

log(x)/2= w+w^3/3+w^5/5+…

#include <stdio.h>
#include <math.h>


#define eps 1e-5
float mylog(float x){
    float w=(x-1)/(x+1),res=0,t=w;
    int i=0;
    while(fabs(t/(2*i+1))>eps){
         res+=t/(2*i+1);
         t*=w*w;
         i++;
    }
    return 2* res;
}

int main(void) {
     float x=1234;
     printf("%f %f\n",mylog(x),log(x));
     return 0;
}
Chi Ngo viết 19:34 ngày 30/09/2018

Mình học lập trình mềm và thuật toán là chủ yếu, cũng rất muốn học lập trình nhúng và lập trình điều khiển. Bạn có tài liệu gì không share cho mình xin với. Email của mình là chingovan@gmail.com, cảm ơn bạn!

Thanh Tung viết 19:41 ngày 30/09/2018

thank bạn nhé. có khi mình phải bảo bạn mình dùng thư viện math vậy. ko có cách nào nữa.

Bài liên quan
0