Làm cách nào để tính căn bậc hai trong Python?


140

Tại sao Python đưa ra câu trả lời "sai"?

x = 16

sqrt = x**(.5)  #returns 4
sqrt = x**(1/2) #returns 1

Vâng tôi biết import math và sử dụng sqrt. Nhưng tôi đang tìm kiếm một câu trả lời cho những điều trên.


31
Hãy thử nó trong Python 3, nó đã được sửa;)
Mark Ransom

2
Tính một căn bậc hai trong python với import mathvà sau x = math.sqrt(25)đó sẽ gán giá trị 5.0cho x.
Eric Leschinski 6/2/2016

1
@Merlin - vui lòng không quay lại các thay đổi cho tiêu đề. Nó làm cho câu hỏi dễ tìm hơn.
ChrisF

2
@ChrisF - đó là câu hỏi của tôi, giải quyết các vấn đề về vấn đề. Dừng thay đổi tiêu đề và nội dung.
Merlin

Câu trả lời:


246

sqrt=x**(1/2)đang làm phép chia số nguyên. 1/2 == 0.

Vì vậy, bạn đang tính x (1/2) trong trường hợp đầu tiên, x (0) trong lần thứ hai.

Vì vậy, nó không sai, đó là câu trả lời đúng cho một câu hỏi khác.


64
"Vì vậy, nó không sai, đó là câu trả lời đúng cho một câu hỏi khác" - thích nó! - nghĩ rằng tôi có thể thử thách bản thân để sử dụng cụm từ này thường xuyên hơn!
Thomas Kimber

6
trong Python 3.6 bạn có câu trả lời đúng cho câu hỏi bạn hỏi đầu tiên.
vwvan

2
Phương thức thứ hai có thể được tính là:sqrt = x**(float(1)/2)
VM_AI

117

Bạn phải viết : sqrt = x**(1/2.0), nếu không thì phép chia số nguyên được thực hiện và biểu thức 1/2trả về 0.

Hành vi này là "bình thường" trong Python 2.x, trong khi trong Python 3.x 1/2ước tính 0.5. Nếu bạn muốn mã Python 2.x của bạn hoạt động như viết phân chia 3.x wrt from __future__ import division- thì 1/2sẽ đánh giá 0.5và để tương thích ngược, 1//2sẽ đánh giá 0.

Và đối với bản ghi, cách ưa thích để tính căn bậc hai là:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

Nó là một bổ sung tầm thường cho chuỗi câu trả lời. Tuy nhiên, vì Chủ đề rất phổ biến trên google, tôi tin rằng nó đáng được thêm vào.


11

/ thực hiện phân chia số nguyên trong Python 2:

>>> 1/2
0

Nếu một trong các số là số float, nó hoạt động như mong đợi:

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0

7

Những gì bạn đang thấy là phân chia số nguyên. Để có được phân chia điểm nổi theo mặc định,

from __future__ import division

Hoặc, bạn có thể chuyển đổi 1 hoặc 2 1/2 thành giá trị dấu phẩy động.

sqrt = x**(1.0/2)

2

Điều này có thể hơi muộn để trả lời nhưng cách đơn giản và chính xác nhất để tính căn bậc hai là phương pháp của newton.

Bạn có một số mà bạn muốn tính căn bậc hai của nó (num)và bạn đoán được căn bậc hai của nó (estimate). Ước tính có thể là bất kỳ số nào lớn hơn 0, nhưng một số có ý nghĩa rút ngắn độ sâu cuộc gọi đệ quy đáng kể.

new_estimate = (estimate + num / estimate) / 2

Dòng này tính toán ước tính chính xác hơn với 2 tham số đó. Bạn có thể chuyển giá trị new_estimate cho hàm và tính toán một new_estimate khác chính xác hơn giá trị trước đó hoặc bạn có thể đưa ra định nghĩa hàm đệ quy như thế này.

def newtons_method(num, estimate):
    # Computing a new_estimate
    new_estimate = (estimate + num / estimate) / 2
    print(new_estimate)
    # Base Case: Comparing our estimate with built-in functions value
    if new_estimate == math.sqrt(num):
        return True
    else:
        return newtons_method(num, new_estimate)

Ví dụ, chúng ta cần tìm căn bậc hai của 30. Chúng tôi biết rằng kết quả là từ 5 đến 6.

newtons_method(30,5)

số là 30 và ước tính là 5. Kết quả từ mỗi cuộc gọi đệ quy là:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

Kết quả cuối cùng là tính toán chính xác nhất của căn bậc hai của số. Nó có cùng giá trị với hàm tích hợp math.sqrt ().


1

Có lẽ một cách đơn giản để nhớ: thêm một dấu chấm sau tử số (hoặc mẫu số)

16 ** (1. / 2)   # 4
289 ** (1. / 2)  # 17
27 ** (1. / 3)   # 3

0

Bạn có thể sử dụng NumPy để tính căn bậc hai của mảng:

 import numpy as np
 np.sqrt([1, 4, 9])

1
Đây là một cách tự nhiên hơn để làm căn bậc hai, nhưng làm thế nào để trả lời câu hỏi (phải thừa nhận rằng nó trả lời câu hỏi trong tiêu đề, nhưng không phải là câu hỏi thực tế trong cơ thể (vâng, đó là một tiêu đề xấu))?
Peter Mortensen

-1

Tôi hy vọng mã được đề cập dưới đây sẽ trả lời câu hỏi của bạn.

def root(x,a):
    y = 1 / a
    y = float(y)
    print y
    z = x ** y
    print z

base = input("Please input the base value:")
power = float(input("Please input the root value:"))


root(base,power) 

Vui lòng chỉnh sửa và thêm một lời giải thích ngắn gọn về lý do tại sao điều này hoạt động. Chỉ là mã không hữu ích lắm.
wjandrea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.