2012-03-07 40 views
73

Tại sao python đưa ra câu trả lời "sai"?Làm thế nào để calc căn bậc hai trong python?

x= 16 

sqrt= x**(.5) 
returns 4 

sqrt= x**(1/2) 
returns 1 

Có, tôi biết import math và sử dụng sqrt. Nhưng tôi đang tìm câu trả lời cho câu hỏi trên.

+20

Dùng thử trong Python 3, đã sửa;) –

+2

Tính căn bậc hai trong python với 'import math' và sau đó là' x = math.sqrt (25) 'sẽ gán giá trị' 5.0' cho x. –

+1

Tiêu đề gây hiểu nhầm ở đó ... – Julian

Trả lời

140

sqrt=x**(1/2) đang thực hiện phân chia số nguyên. 1/2 == 0.

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

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

+23

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

+2

trong Python 3.6 bạn nhận được câu trả lời đúng cho câu hỏi mà bạn đã hỏi trước. – vwvan

7

/ thực hiện một phép chia số nguyên bằng Python 2:

>>> 1/2 
0 

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

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

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

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

Và đối với các hồ sơ, cách ưa thích để tính toán một căn bậc hai là:

import math 
math.sqrt(x) 
+1

+1 cũng trả lời câu hỏi từ tiêu đề. –

+1

phủ định 1 vì không đọc câu hỏi ... – Merlin

5

Những gì bạn đang nhìn thấy sự phân chia số nguyên là. Để nhận 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 một giá trị dấu phẩy động.

sqrt = x**(1.0/2) 
-1

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

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

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

from __future__ import print_function 

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) 

Kính trọng, Ali

1

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

Bạn có một số mà bạn muốn tính căn bậc hai của mình (num) và bạn có thể đoán căn bậc hai của nó là (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 một cách đáng kể.

new_estimate = (estimate + num/estimate)/2 

Dòng này tính toán chính xác hơn với 2 thông số đó. Bạn có thể chuyển giá trị new_estimate cho hàm và tính một new_estimate khác chính xác hơn giá trị trước đó hoặc bạn có thể tạo một đị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 ta biết rằng kết quả là giữa 5 và 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ăn bậc hai của số. Nó có cùng giá trị với hàm math.sqrt().

Các vấn đề liên quan