Tìm căn bậc hai không dùng sqrt – Tính căn bậc hai không dùng hàm

Tìm căn bậc hai không sử dụng hàm sqrt? Bạn nghĩ sao?

Hôm nay Nguyễn Văn Hiếu quay lại cùng với một bài toán đơn thuầ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 1 số ít. Chắc không ai quên được tên hàm nó chính là hàm sqrt ( ). Nhưng những bạn đã khi nào tự hỏi làm thế nào để hoàn toàn 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ìm căn bậc hai không dùng hàm sqrt

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

0123456789101112

/ / Code from https://final-blade.com

#include

#include

intmain()

{

intx;

printf(” Input x : “);

scanf(” % d “,và x ) ;

printf(” Sqrt of % d = % f \ n “,x,sqrt(x));

}

Chạy demo :

0123

Inputx:5

Sqrtof5=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 hiệu quả có sai số cao hơn epsilon, update lại hiệu quả theo công thức

012

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 rất đầy đủ cho ý tưởng sáng tạo này là

0123456789101112131415161718192021222324

/ / Code from https://final-blade.com

#include

#include

# define EPSILON 0.0001 f

doublemySqrt(intnumber)

{

doubleresult=1.0 f;

while(fabs(result *result-number)/number>=EPSILON)

result=(number/result-result)/2+result;

returnresult;

}

intmain()

{

intx;

printf(” Input x : “);

scanf(” % d “,và x ) ;

printf(” Sqrt of % d = % 1.9 f \ n “,x,mySqrt(x));

return0;

}

Và chạy thử xem sao

0123

Inputx:5

Sqrtof5=

2.236069

Ok, hy vọng rằng bài viết san sẻ được cho bạn những kỹ năng và kiến thức hữu dụng về lập trình .
Nếu bạn chăm sóc đến kỹ năng và kiến thức lập trình C / C + +, hãy đọc những bài viết ở đây nhé