ฉันจะคำนวณสแควร์รูทใน Python ได้อย่างไร


140

ทำไมไพ ธ อนจึงให้คำตอบที่ "ผิด"?

x = 16

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

ใช่ฉันรู้และการใช้งานimport math sqrtแต่ฉันกำลังมองหาคำตอบข้างต้น


31
ลองใช้ใน Python 3 ได้รับการแก้ไข;)
Mark Ransom

2
คำนวณสแควร์รูทในไพ ธ อนด้วยimport mathจากนั้นx = math.sqrt(25)ซึ่งจะกำหนดค่า5.0ให้กับ x
Eric Leschinski

1
@Merlin - โปรดอย่าย้อนกลับการเปลี่ยนแปลงของชื่อ มันทำให้การค้นหาคำถามง่ายขึ้น
ChrisF

2
@ChrisF - คำถามของฉันอยู่ประเด็น muliple หยุดเปลี่ยนชื่อและเนื้อหา
เมอร์ลิน

คำตอบ:


246

sqrt=x**(1/2)กำลังทำการแบ่งจำนวนเต็ม 1/2 == 0.

คุณกำลังคำนวณ x (1/2)ในตัวอย่างแรก x (0)ในวินาที

ดังนั้นจึงไม่ผิดมันเป็นคำตอบที่ถูกต้องสำหรับคำถามอื่น


64
"ดังนั้นมันไม่ผิดมันเป็นคำตอบที่ถูกต้องสำหรับคำถามอื่น" - รักเลย! - คิดว่าฉันอาจท้าทายตัวเองให้ใช้วลีนี้บ่อยขึ้น!
โทมัส Kimber

6
ใน Python 3.6 คุณจะได้รับคำตอบที่ถูกต้องสำหรับคำถามที่คุณถามก่อน
vwvan

2
วิธีที่สองสามารถคำนวณได้เป็น:sqrt = x**(float(1)/2)
VM_AI

117

คุณต้องเขียน: sqrt = x**(1/2.0)มิฉะนั้นส่วนจำนวนเต็มจะดำเนินการและการแสดงออกผลตอบแทน1/20

ลักษณะการทำงานนี้เป็น "ปกติ" ในหลาม 2.x ในขณะที่ในหลาม 3.x ประเมิน1/2 0.5หากคุณต้องการรหัส 2.x หลามของคุณเพื่อทำตัวเหมือน 3.x WRT ส่วนเขียนfrom __future__ import division- แล้ว1/2จะประเมิน0.5และหลังเข้ากันได้, จะมีการประเมินเพื่อ1//20

และสำหรับบันทึกวิธีที่ต้องการในการคำนวณรากที่สองคือ:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

มันเป็นเรื่องเล็กน้อยนอกจากนี้ในห่วงโซ่คำตอบ อย่างไรก็ตามเนื่องจากหัวเรื่องเป็นสิ่งที่พบเห็นได้ทั่วไปใน google Hit ฉันสมควรได้รับการเพิ่มสิ่งนี้


11

/ ดำเนินการแบ่งจำนวนเต็มใน Python 2:

>>> 1/2
0

หากหนึ่งในตัวเลขนั้นเป็นทศนิยมมันจะทำงานตามที่คาดไว้:

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

7

สิ่งที่คุณเห็นคือการหารจำนวนเต็ม ในการรับค่าทศนิยมหารตามค่าเริ่มต้น

from __future__ import division

หรือคุณสามารถแปลง 1 หรือ 2 ของ 1/2 เป็นค่าทศนิยม

sqrt = x**(1.0/2)

2

นี่อาจเป็นคำตอบที่ล่าช้าเล็กน้อย แต่วิธีที่ง่ายและแม่นยำที่สุดในการคำนวณสแควร์รูทเป็นวิธีการของนิวตัน

คุณมีจำนวนที่คุณต้องการคำนวณสแควร์รูทของมัน(num)และคุณก็เดาได้ว่าสแควร์รูท(estimate)นั้น การประมาณสามารถเป็นตัวเลขใด ๆ ที่มากกว่า 0 แต่ตัวเลขที่เหมาะสมจะทำให้ความลึกของการโทรซ้ำเกิดขึ้นอย่างมีนัยสำคัญ

new_estimate = (estimate + num / estimate) / 2

บรรทัดนี้คำนวณการประมาณการที่แม่นยำยิ่งขึ้นด้วยพารามิเตอร์ทั้งสอง คุณสามารถส่งค่า new_estimate ไปยังฟังก์ชันและคำนวณ new_estimate อื่นที่มีความแม่นยำมากกว่าค่าก่อนหน้านี้หรือคุณสามารถสร้างนิยามฟังก์ชันแบบเรียกซ้ำได้เช่นนี้

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)

ตัวอย่างเช่นเราต้องการค้นหาสแควร์รูทของ 30 เรารู้ว่าผลลัพธ์อยู่ระหว่าง 5 ถึง 6

newtons_method(30,5)

หมายเลขคือ 30 และค่าประมาณคือ 5 ผลลัพธ์จากการโทรซ้ำแต่ละครั้งคือ:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

ผลลัพธ์สุดท้ายคือการคำนวณที่ถูกต้องที่สุดของสแควร์รูทของจำนวน มันเป็นค่าเดียวกับฟังก์ชั่นในตัว math.sqrt ()


1

อาจเป็นวิธีง่ายๆในการจำ: เพิ่มจุดหลังตัวเศษ (หรือส่วน)

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

0

คุณสามารถใช้ NumPy เพื่อคำนวณรากที่สองของอาร์เรย์:

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

1
นี่เป็นวิธีที่เป็นธรรมชาติมากขึ้นในการทำสแควร์รูท แต่จะตอบคำถามอย่างไร (ยอมรับได้ว่าตอบคำถามในชื่อ แต่ไม่ใช่คำถามจริงในร่างกาย (ใช่มันเป็นชื่อที่ไม่ดี))
Peter Mortensen

-1

ฉันหวังว่ารหัสที่กล่าวถึงด้านล่างจะตอบคำถามของคุณ

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) 

โปรดแก้ไขและเพิ่มคำอธิบายสั้น ๆ ว่าเหตุใดจึงใช้งานได้ เพียงแค่รหัสไม่เป็นประโยชน์มาก
wjandrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.