Як обчислити квадратний корінь у Python?


140

Чому Python дає "неправильну" відповідь?

x = 16

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

Так, я знаю import mathі використовую sqrt. Але я шукаю відповідь на сказане.


31
Спробуйте в Python 3, це виправлено;)
Марк Ransom

2
Обчисліть квадратний корінь у python з, import mathа потім, x = math.sqrt(25)який призначить значення 5.0x.
Ерік Лещинський

1
@Merlin - не скасовуйте зміни в заголовку. Це полегшує пошук.
ChrisF

2
@ChrisF - моє запитання, вирішує багато питань. Зупиніть змінювати заголовок та зміст.
Мерлін

Відповіді:


246

sqrt=x**(1/2)робить ціле ділення. 1/2 == 0.

Отже, ви обчислюєте х (1/2) у першому випадку, x (0) у другому.

Тож це не помиляється, це правильна відповідь на інше питання.


64
«Тож це не помиляється, це правильна відповідь на інше питання» - любите! - думаю, що я можу кинути виклик собі використовувати цю фразу частіше!
Томас Кімбер

6
в Python 3.6 ви отримуєте правильну відповідь на запитання, яке ви задали спочатку.
vwvan

2
Другий метод можна обчислити так:sqrt = x**(float(1)/2)
VM_AI

117

Ви повинні записати: sqrt = x**(1/2.0)інакше виконується ціле ділення і вираз 1/2повертається 0.

Така поведінка є "нормальною" в Python 2.x, тоді як в Python 3.x 1/2оцінює до 0.5. Якщо ви хочете, щоб ваш код Python 2.x поводився так, як пишуть розділення 3.x wrt from __future__ import division- тоді ви 1/2будете оцінювати 0.5сумісність і назад, 1//2буде оцінювати 0.

А для запису кращим способом обчислення квадратного кореня є такий:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

Це банальне доповнення до ланцюжка відповідей. Однак оскільки тема є дуже поширеним хітом Google, я вважаю, що це заслуговує додати.


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

Цей рядок обчислює більш точну оцінку з цими 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
Це більш природний спосіб зробити квадратне коріння, але як він відповідає на питання (правда, він відповідає на запитання в заголовку, але не актуальне питання в тілі (так, це поганий заголовок))?
Пітер Мортенсен

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.