Các hàm số học exp(), Idexp(), modf, ln(), log10(), ceil(), floor(), atoi(chuyển chữ thành số).

Mô tả dự án: 

Bài này bổ xung các tập lệnh về các phép tính : exp(ex), Idexp(x*2exponent),  modf, ln(x), log10(x), floor(), ceil(), atoi()…

Các kiến thức liên quan

Hằng số toán học e là cơ số của logarit tự nhiên.

Giá trị số của e tới 20 chữ số thập phân là:

e=2,71828 18284 59045 23536...

Đồ thị hàm y = ax.

Hàm exp(x)

Cấu trúc

double exp(double x) 

Kiểu tham trị x: double.

Kiểu trả về: double.

Trả về giá trị của biếu thức: ex

Đồ thị hàm y = ex.

Ví dụ

double x = 4;
double y;
void setup()
{
    Serial.begin(9600);
    y = exp(x);
    Serial.println(y, 5); // lấy 5 số phần thập phân
    //y=54.59815
}
void loop() {}

Hàm frexp(x, int *exp)

Cấu trúc

double frexp(double x, int *exponent) 
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.
  • Kiểu con trỏ: int.

Giá trị được trả về gồm 2 số:

  • mantissa (phần định trị x )
  • số nguyên được trỏ tới bởi exponent (số mũ a ).

 Thuộc biểu thức y = x * (2a).

Ví dụ

double y = 20000; // y=x*(2 mũ a)
int a; // số mũ
double x; // phần định trị
void setup()
{
    Serial.begin(9600);

    x = frexp(y, &a); // chú ý thêm dấu "&" (phép gán địa chỉ)

    Serial.println(a);
    Serial.println(x, 8); // lấy 8 số phần thập phân để xem
    //a= 15
    //x=0.61035156
    // tóm lại : y=0.6103 * (2^15) !
}
void loop() {}

Hàm ldexp(x, int exp)

Cấu trúc

double ldexp(double x, int exponent)

Trả về giá trị của biểu thức :  x*2exponent

Kiểu tham trị exponent: int. (exponent dịch sang tiếng Việt là “số mũ” ).

Kiểu tham trị x: double.

Kiểu trả về: double.

Chú ý: kí tự “l” trong chữ “ldexp” là chữ e-lờ cao (viết thường).

Ví dụ

double y; // y=x*(2 mũ a)
int a = 15; // số mũ
double x = 0.61035156; // phần định trị
void setup()
{
    Serial.begin(9600);
    y = ldexp(x, a);

    Serial.println(y, 8); // lấy 8 số phần thập phân để xem
    //y=20000.00000000
}
void loop() {}

Hàm log( x)

Cấu trúc

double log(double x)
  • Trả về ln(x)
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.

 

 

Ví dụ

double y; // y=ln(x)
double x = 6.5;
void setup()
{
    Serial.begin(9600);
    y = log(x);

    Serial.println(y, 8); // lấy 8 số phần thập phân để xem
    //y=1.87180223
}
void loop() { }

Hàm log10(x)

Cấu trúc

double log10(double x) 
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.
  • Trả về log10(x)

 

 

Ví dụ

double y; // y=log10(x)
double x = 4.0;
void setup()
{
    Serial.begin(9600);
    y = log10(x);
    Serial.println(y, 8); // lấy 8 số phần thập phân để xem
    //y=0.60206003
}
void loop() { }

Hàm modf(x, *i)

Cấu trúc

 double modf(double x, double *integer)
  • Tách lấy phần nguyên và phần thập phân của một số thực.
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.

Chú ý thêm kí tự “&” cho biến con trỏ.!

Ví dụ

double S = 62.123456;
double Phan_nguyen, Phan_thap_phan;
void setup()
{
    Serial.begin(9600);
    Phan_thap_phan = modf(S, &Phan_nguyen);
    Serial.println(Phan_thap_phan, 6); // lấy 6 số phần thập phân để xem
    Serial.println(Phan_nguyen, 1); // lấy 1 số phần thập phân để xem
}
void loop() {}

Hàm ceil(x)

Cấu trúc

 double ceil(double x)
  • Trả về giá trị nguyên nhỏ nhất lớn hơn hoặc bằng x
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.

Ví dụ

 x
ceil(x)
1.2
2
1.5
2
1.9
2
2.0
2
2.1
3

Ví dụ

float a = 1.2;
double b;
void setup()
{
    Serial.begin(9600);
    b = ceil(a);
    Serial.println(b, 1); // lấy 1 số phần thập phân để xem
    // b=2.0
}
void loop() { ; }

Hàm floor(x)

Cấu trúc

double floor(double x) 
  • Kiểu tham trị x: double.
  • Kiểu trả về: double.
  • Trả về giá trị nguyên lớn nhất nhỏ hơn hoặc bằng x

Ví dụ

x
floor(x)
1.2
1
1.5
1
1.9
1
2.0
2
2.1
2

Ví dụ

float a = 2.0;
double b;
void setup()
{
    Serial.begin(9600);
    b = floor(a);
    Serial.println(b, 1); // lấy 1 số phần thập phân để xem
    // b=2.0
}
void loop() {  }

Hàm atoi(a[])

Cấu trúc

int atoi(const char *A)

Hàm này dùng để chuyển đổi kí tự dạng chữ số (kiểu char) về chữ số. Nó trả về số nguyên đã được chuyển đổi dưới dạng một giá trị int. Nếu không có sự chuyển đổi hợp lệ nào được thực hiện, hàm trả về 0.

Khi đó số nhập vào có giá trị trong khoảng từ (-32768 -> 32767 ).

Ví dụ 1

const char Number[5] = "12345"; // mảng kí tự
//hoặc : const char Number[]="12345";
int S;
void setup()
{
    Serial.begin(9600);
    S = atoi(Number);
    Serial.println(S);
    // Kết quả S là một số có giá trị S=12345.
}
void loop() { }

Ví dụ 2: Biểu diễn một số âm

Chú ý kích cỡ của mảng sẽ tăng thêm 1 đơn vị để lưu thêm dấu “-“ đằng trước số âm.

const char Number[] = "-12345"; // mảng kí tự
//hoặc : const char Number[6]="-12345";
int S;
void setup()
{
    Serial.begin(9600);
    S = atoi(Number);
    Serial.println(S);
    // Kết quả S là một số có giá trị S=12345.
}
void loop() {  }

Ví dụ 3: Nhập chữ số xem như giá trị

Các bạn chú ý cỡ của mảng phải bằng số lượng chữ cái của số muốn nhập.

Số từ  (-99 đến 999) thì cỡ mảng là 3.

Số từ (-999 đến 9999 ) thì cỡ mảng là 4.

Số từ (-9999 đến đến  32767) thì cỡ mảng là 5.

Số từ (-32768 đến -10000) thì cỡ mảng là 6.

char Number[5]; // mảng kí tự
int S;
void setup()
{
    Serial.begin(9600);
    // Kết quả S là một số có giá trị S=12345.
    Serial.println("Nhap so :");
}
void loop()
{
    while (1) { //lặp để quét
        if (Serial.available()) {

            Serial.readBytes(Number, 5); // đọc 5 byte Char với
            S = atoi(Number);
            Serial.println(S);
        }
    }
}

Hàm itoa ()

Hàm này dùng để chuyển một số sang chuỗi kí tự !

char *  itoa ( int value, char * str, int base );

Trong đó:

  • value : là số cần truyền , (nếu value là một số âm thì kí tự "-" sẽ được đặt ở đầu chuỗi !)
  • str : mảng chuỗi để lưu số dưới dạng kí tự
  • base : để lựa chọn dạng cơ số muốn chuyển về 
    • base =2 : chuỗi kí tự có dạng số nhị phân
    • base=8 :  chuỗi kí tự có dạng bát phân
    • base =10 : chuỗi kí tự có dạng thập phân
    • base=16 : chuỗi kí tự có dạng HEX (thập lục phân)

Ví dụ minh họa :

void setup()
{

    Serial.begin(9600);
}
int a = 1234;
char chu_so[20];
void loop()
{

    itoa(a, chu_so, 10); // chuyển thành số thập phân
    Serial.println(chu_so);
    itoa(a, chu_so, 16); // chuyển thành số hex
    Serial.println(chu_so);
    itoa(a, chu_so, 8); // chuyển thành số bát phân
    Serial.println(chu_so);
    itoa(a, chu_so, 2); // chuyển thành số nhị phân
    Serial.println(chu_so);
    delay(1000);
    Serial.println("___________");
}

 

lên
6 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

ST7565 | Chuyển động trong lập trình Game và đồ họa

Hẳn là các bạn ít nhiều cũng đã từng có một tuổi thơ dữ dội cùng với trò xếp gạch, xe tăng trên các máy chơi game đen trắng cầm tay, phá đảo thế giới ảo cùng với Contra, Super Mario, MUblushlaugh…Và khi lớn lên, chúng ta lại thích thú trong việc làm sao để tạo ra các chuyển động như vậy, nói đúng hơn là làm game.enlightenedcoolBài viết này sẽ giúp bạn hiểu hơn cách tạo ra các hiệu ứng chuyển động hình ảnh trong lập trình đồ họa nói chung và game nói riêng. Tất nhiên là bằng board mạch Arduino cùng với LCD ST7565.

lên
20 thành viên đã đánh giá bài viết này hữu ích.

Sử dụng Ic SRAM 23LC1024 bằng Driver với thư viện SRAM_MANAGER cho arduino

Ở 2 bài trước, chúng ta đã biết cách giao tiếp và lưu trữ cơ bản trên 2 loại SRAM. Sau gần 6 tháng làm việc với SRAM trong các dự án, hôm nay mình sẽ chia sẻ 1 driver do mình thiết kế, nó dùng để hỗ trợ quản lý SRAM 23lc1024, đem đến cách dùng RAM ngoài thân thiện hơn cho lập trình viên.

lên
7 thành viên đã đánh giá bài viết này hữu ích.