Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8

Trong bài viết này chúng ta sẽ tìm hiểu về hàm sqrt() trong C++. Đây là hàm được sử dụng rất nhiều trong các ngôn ngữ lập trình khi giải các bài toán.

I. Căn Bậc 2 Trong C++ Là Gì ?

Hàm sqrt() là hàm có sẵn trong thư viện math, vì vậy trước khi sử dụng nó hãy khai báo thư viện đã nhé: #include

Hàm sqrt() là hàm được sử dụng để tính căn bậc hai của một số. Tham số truyền vào nó là một số bất kỳ và giá trị trả về là căn bậc hai của tham số đó.

Cú pháp:

sqrt(x)

Trong đó x là một số truyền vào bất kỳ, có thể là số nguyên hoặc số thực.

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Căn Bậc 2 Trong C++ Là Gì ?

II. Hàm Tính Căn Bậc 2 Trong C++

Hôm nay Techacademy quay lại cùng với một bài toán đơn giản mà phức tạp. Chắc hẳn khi học lập trình bạn nào cũng đã từng tính căn bậc hai của một số. Chắc không ai quên được tên hàm nó chính là hàm sqrt(). Nhưng các bạn đã bao giờ tự hỏi làm sao để có thể tự viết hàm sqrt() này chưa? Hãy cũng mình đi tìm giải pháp trong bài viết này nhé.

Tính căn bậc hai sử dụng hàm trong C/C++

// Code from https://techacademy.edu.vn #include #include int main() { int x; printf("Input x: "); scanf("%d", &x); printf("Sqrt of %d = %f\n", x, sqrt(x)); }

Chạy demo:

Input x: 5 Sqrt of 5 = 2.236068

Tìm căn bậc hai của một số không dùng hàm thì sao?

Ý tưởng tìm căn bậc hai:

  • Khai báo 1 epsilon đặt sai số chấp nhận, vì căn bậc hai của một số có thể là số thập phân vô hạn
  • Khởi tạo kết quả bằng 1.0

Nếu kết quả có sai số cao hơn epsilon, cập nhật lại kết quả theo công thức

result = (number/result - result) / 2 + result;
  • Mình sẽ thu hẹp dần giới hạn trên và giới hạn dưới của kết quả, lấy trung bình hiệu khoảng cách giới hạn đó để cập nhật kết quả. Điều này luôn đảm bảo rằng giới hạn trên dưới sẽ bị thu hẹp nhưng sẽ luôn bao bọc đáp án.
  • Nếu kết quả có sai số nhỏ hơn EPSILON thì dừng lại và lấy kết quả đó làm đáp án.

Ví dụ: Bạn cần tính căn bậc 2 của 5.

  • Ta khởi tạo kết quả là 1.0. Kết quả này dĩ nhiên không đúng rồi, nên đáp số sẽ nằm trong khoảng 1.0 và 5/1.0 = 5.0.
  • Lấy một nửa hiệu khoảng 1.0 đến 5.0 là 1.0 + (5.0 – 1.0)/2 được 3.0. Nhưng 3.0 lớn hơn kết quả thực(bình phương là biết, trong code thì sai số để check),
  • Lại lấy nửa hiệu khoảng từ 5/3.0 đến 3.0 cộng vào kết quả hiện tại(3.0) = 3.0 + (5/3.0 – 3.0) = 2.33…
  • Cứ làm tiếp tục như vậy cho tới khi sai số nhỏ hơn EPSILON

Code đầy đủ cho ý tưởng này là

// Code from https://techacademy.edu.vn #include #include #define EPSILON 0.0001f double mySqrt(int number) { double result = 1.0f; while (fabs(result * result - number) / number >= EPSILON) result = (number / result - result) / 2 + result; return result; } int main() { int x; printf("Input x: "); scanf("%d", &x); printf("Sqrt of %d = %1.9f\n", x, mySqrt(x)); return 0; }

Và chạy thử xem sao

Input x: 5 Sqrt of 5 = 2.236069
Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Hàm Tính Căn Bậc 2 Trong C++

III. Ví Dụ Về Căn Bậc 2 Trong C++

Trong phần này mình sẽ thực hiện hai ví dụ sử dụng hàm sqrt() để các bạn có thể so sánh kết quả nhé.

Ví dụ 1: Ở ví dụ này mình sẽ khai báo và khởi tạo giá trị x = 9, sau đó gọi hàm sqrt() để tính căn bậc hai của x.

#include #include using namespace std; int main() { //khai báo và khởi tạo giá trị x = 9 double x = 9, result; //gọi hàm sqrt() để tính căn bậc hai của x result = sqrt(x); //hiển thị kết quả ra màn hình cout << "Căn bậc hai của " << x << " là " << result << endl; cout<<"\n--------------------------------------------\n"; cout<<"Chương trình này được đăng tại techacademy.edu.vn"; }

Kết quả:

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Ví Dụ Về Căn Bậc 2 Trong C++

Ví dụ 2: Ở ví dụ này mình sẽ thay đổi giá trị của x thành 125, cùng xem kết quả nhé.

#include #include using namespace std; int main() { //khai báo và khởi tạo giá trị x = 125 double x = 125, result; //gọi hàm sqrt() để tính căn bậc hai của x result = sqrt(x); //hiển thị kết quả ra màn hình cout << "Căn bậc hai của " << x << " là " << result << endl; cout<<"\n--------------------------------------------\n"; cout<<"Chương trình này được đăng tại Freetuts.net"; }

Kết quả:

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Ví Dụ Về Căn Bậc 2 Trong C++

IV. Căn Bậc N Trong C

Bài này mình sẽ hướng dẫn các bạn mới học lập trình cách để tính căn bậc n với n là một số bất kỳ nhé, nhưng n >= 2 nha. Chỉ là chỉ lại giúp các bạn nhớ lại toán học thôi ^^.

Một số thắc mắc của các bạn sinh viên:

  • Tình hình là em đang bí trong cách tính căn bậc n của 1 số. Thực tình em mới học môn này được 2 tuần nên thực tình ko biết giải quyết thế nào, ai biết phép toán của nó ra sao thì giúp em với?
  • Trong C chỉ có hàm sqrt để tính căn bậc 2, vậy nếu em muốn tính căn bậc 3 hay căn bậc n của một số thì làm thế nào ạ?

Tính căn bậc 3 trong C/C++

Để tính căn bậc 3 trong C/C++, bạn sử dụng công thức toán học sau. Công thức này đúng với căn bậc n luôn nhé. Bạn có thể áp dụng để tính căn bậc n của số bất kỳ:

Như vậy, với một số x = 8 chẳng hạn, bạn muốn tính căn bậc 3 của 8. Khi đó, trong công thức trên x = 8, n = 3, m = 1. Vậy ta sẽ phải tính x1/3

Để tính ax trong C/C++, chúng ta có thể sử dụng hàm pow() có cú pháp như sau:

double pow (double base, double exponent);

Ví dụ dưới đây sử dụng C/C++ để tính căn bậc 3 của 8 theo cách trên. Các bạn lưu ý em kiểu cho số mũ nhé. Vì 2 số nguyên chia cho nhau sẽ chỉ ra giá trị nguyên(1/3 = 0).

#include #include int main () { int a = 8; printf("%f", pow(a, 1.0/3)); }

Kết quả: 2.000000

Như vậy, để tính căn bậc n của số a, bạn sẽ dùng hàm pow để tính kết quả của phép tính a1/n

Tính căn bậc 3 không dùng hàm pow

Để tính căn bậc 3 của 1 số dương a ( tổnq quát căn bậc n ), ta phải xây dựng một chuỗi ( toán học ) mà chuỗi này hội tụ về căn bậc 3 của a. Sau đó lặp hữu hạn 1 số lần để được kết quả với độ chính xác nào đó chấp nhận được. Sau day la chuong trinh trong C de thuật tính căn bậc 3 cua 2 voi độ chính xác 0.00000001 chỉ bằng các phép toán +, – , *, / mà thôi.

Dưới đây là lời giải tính căn bậc 3 của 2 của một thành viên trong Cộng đồng C Việt:

//////////////////////////////////////////////////////////////////////// // Cube root of 2 by Nguyen Van Noi - DHTG // Email : /////////////////////////////////////////////////////////////////////// #include double myabs(double x) { return ((x>=0)?x:(-x)); } void main() { double a=2.0, xo, xn=1, e=1e-8; do { xo=xn; xn=(a/xo/xo+2.0*xo)/3.0; } while (myabs(xn-xo)>e); printf("Can bac 3 cua 2 = %1.8f\n",xn); }

Một lời giải khác do mình tổng hợp:

Ý tưởng: Tìm phần nguyên trước, sau đó tìm phần thập phân.

Với cách làm này, bạn chỉ thu được kết quả xấp xỉ với đáp án chính xác. Độ chính xác phụ thuộc vào giá trị precision mà bạn mong muốn.

#include double cubeRoot(double n) { double i, precision = 0.000001; for(i = 1; (i*i*i) <= n; ++i); //tim phan nguyen for(--i; (i*i*i) < n; i += precision); //tim phan thap phan return i; } int main() { int n = 125; printf("Can bac ba cua %d = %lf", n, cubeRoot(n)); return 0; }

Chạy thử:

Can bac 3 cua 125 = 5.000000
Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Căn Bậc N Trong C

V. Dấu Căn Bậc 2 Trong C++

Hàm sqrt() trong C

Hàm double sqrt(double x) trong Thư viện C trả về căn bậc hai của x.

Khai báo hàm sqrt() trong C

Dưới đây là phần khai báo cho hàm sqrt() trong C:

double sqrt(double x)

Tham số

x − Đây là giá trị số thực dấu chấm động.

Trả về giá trị

Hàm này trả về căn bậc hai của x.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm sqrt() trong C:

#include #include int main () { printf("Can bac hai cua %lf bang %lf\n", 4.0, sqrt(4.0) ); printf("Can bac hai cua %lf bang %lf\n", 5.0, sqrt(5.0) ); return(0); }

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Dấu Căn Bậc 2 Trong C++

VI. Hàm Căn Bậc 3 Trong C++

Bài tập C: Tìm căn bậc ba của một số

Tương tự như cách tìm căn bậc hai (không sử dụng hàm sqrt()), bài tập C này có thể được giải theo hai bước:

Tìm phân nguyên

Tìm phần thập phân

Đây chỉ là cách giải cho kết quả xấp xỉ, và độ chính xác phụ thuộc vào số các số sau dấu thập phân.

Bạn theo dõi phần code dưới đây để hiểu cách tìm căn bậc ba của một số bất kỳ trong C.

Chương trình C

Dưới đây là chương trình C để giải bài tập tìm căn bậc ba của một số trong C:

#include double cubeRoot(double n) { double i, precision = 0.000001; for(i = 1; (i*i*i) <= n; ++i); //tim phan nguyen for(--i; (i*i*i) < n; i += precision); //tim phan thap phan return i; } int main() { int n = 125; printf("Can bac ba cua %d = %lf", n, cubeRoot(n)); return 0; }

Biên dịch chương trình C trên sẽ cho kết quả:

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Hàm Căn Bậc 3 Trong C++

VII. Bài Tập Về Căn Bậc 2 Trong C++

Đề bài

Viết chương trình giải phương trình bậc 2 trong C++. Phương trình bậc 2 có dạng:

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Bài Tập Về Căn Bậc 2 Trong C++

Lời giải

Lời giải của chúng tôi sử dụng phương thức sqrt() để tính căn bậc 2 của một số trong C++.

#include #include using namespace std; /** * giai phuong trinh bac 2: ax2 + bx + c = 0 * * @param a: he so bac 2 * @param b: he so bac 1 * @param c: so hang tu do */ void giaiPTBac2(float a, float b, float c) { // kiem tra cac he so if (a == 0) { if (b == 0) { printf("Phuong trinh vo nghiem!"); } else { printf("Phuong trinh co mot nghiem: x = %f", (-c / b)); } return; } // tinh delta float delta = b*b - 4*a*c; float x1; float x2; // tinh nghiem if (delta > 0) { x1 = (float) ((-b + sqrt(delta)) / (2*a)); x2 = (float) ((-b - sqrt(delta)) / (2*a)); printf("Phuong trinh co 2 nghiem la: x1 = %f va x2 = %f", x1, x2); } else if (delta == 0) { x1 = (-b / (2 * a)); printf("Phong trinh co nghiem kep: x1 = x2 = %f", x1); } else { printf("Phuong trinh vo nghiem!"); } } /** * ham main */ int main() { float a, b, c; cout << "Nhap he so bac 2, a = "; cin >> a; cout << "Nhap he so bac 1, b = "; cin >> b; cout << "Nhap so hang tu do, c = "; cin >> c; giaiPTBac2(a, b, c); return 1; }

Kết quả:

Nhap he so bac 2, a = 2 Nhap he so bac 1, b = 3 Nhap so hang tu do, c = 1 Phuong trinh co 2 nghiem la: x1 = -0.500000 va x2 = -1.000000

VIII. Tìm Căn Bậc Hai Không Dùng Sqrt

Tìm căn bậc hai không sử dụng hàm sqrt? Bạn nghĩ sao? Hôm nay Techacademy quay lại cùng với một bài toán đơn giản mà phức tạp. Chắc hẳn khi học lập trình bạn nào cũng đã từng tính căn bậc hai của một số. Chắc không ai quên được tên hàm nó chính là hàm sqrt(). Nhưng các bạn đã bao giờ tự hỏi làm sao để có thể tự viết hàm sqrt() này chưa? Hãy cũng mình đi tìm giải pháp trong bài viết này nhé.

Tính căn bậc 2 của số nguyên bất kỳ bằng babylonian method với sai số 10 8
Tìm Căn Bậc Hai Không Dùng Sqrt

Tìm căn bậc hai của một số không dùng hàm thì sao?

Ý tưởng tìm căn bậc hai:

  • Khai báo 1 epsilon đặt sai số chấp nhận, vì căn bậc hai của một số có thể là số thập phân vô hạn.
  • Khởi tạo kết quả bằng 1.0

Nếu kết quả có sai số cao hơn epsilon, cập nhật lại kết quả theo công thức

result = (number/result – result) / 2 + result;
  • Mình sẽ thu hẹp dần giới hạn trên và giới hạn dưới của kết quả, lấy trung bình hiệu khoảng cách giới hạn đó để cập nhật kết quả. Điều này luôn đảm bảo rằng giới hạn trên dưới sẽ bị thu hẹp nhưng sẽ luôn bao bọc đáp án.
  • Nếu kết quả có sai số nhỏ hơn EPSILON thì dừng lại và lấy kết quả đó làm đáp án.

Ví dụ: Bạn cần tính căn bậc 2 của 5.

  • Ta khởi tạo kết quả là 1.0. Kết quả này dĩ nhiên không đúng rồi, nên đáp số sẽ nằm trong khoảng 1.0 và 5/1.0 = 5.0.
  • Lấy một nửa hiệu khoảng 1.0 đến 5.0 là 1.0 + (5.0 – 1.0)/2 được 3.0. Nhưng 3.0 lớn hơn kết quả thực(bình phương là biết, trong code thì sai số để check),
  • Lại lấy nửa hiệu khoảng từ 5/3.0 đến 3.0 cộng vào kết quả hiện tại(3.0) = 3.0 + (5/3.0 – 3.0) = 2.33…
  • Cứ làm tiếp tục như vậy cho tới khi sai số nhỏ hơn EPSILON

Code đầy đủ cho ý tưởng này là

// Code from https://nguyenvanhieu.vn #include #include #define EPSILON 0.0001f double mySqrt(int number) { double result = 1.0f; while (fabs(result * result – number) / number >= EPSILON) result = (number / result – result) / 2 + result; return result; } int main() { int x; printf(“Input x: “); scanf(“%d”, &x); printf(“Sqrt of %d = %1.9fn”, x, mySqrt(x)); return 0; }

Và chạy thử xem sao

Input x: 5 Sqrt of 5 = 2.236069