Como calculo raiz quadrada em Python?


140

Por que o Python dá a resposta "errada"?

x = 16

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

Sim, eu sei import mathe uso sqrt. Mas estou procurando uma resposta para o exposto acima.


31
Experimentá-lo em Python 3, ele é fixo;)
Mark Ransom

2
Calcule uma raiz quadrada em python com import mathe, em seguida, x = math.sqrt(25)que atribuirá o valor 5.0a x.
Eric Leschinski

1
@ Merlin - por favor, não reverta as alterações no título. Isso torna a pergunta mais fácil de encontrar.
ChrisF

2
@ ChrisF - é a minha pergunta, aborda várias questões. Pare de alterar o título e o conteúdo.
Merlin

Respostas:


246

sqrt=x**(1/2)está fazendo divisão inteira. 1/2 == 0.

Então você está computando x (1/2) na primeira instância, x (0) na segunda.

Portanto, não está errado, é a resposta certa para uma pergunta diferente.


64
"Portanto, não está errado, é a resposta certa para uma pergunta diferente" - adore! - acho que posso me desafiar a usar essa frase com mais frequência!
22416 Thomas Thomasberber

6
no Python 3.6, você obtém a resposta certa para a pergunta que você fez pela primeira vez.
vwvan

2
O segundo método pode ser calculado como:sqrt = x**(float(1)/2)
VM_AI

117

Você deve escrever sqrt = x**(1/2.0):, caso contrário, uma divisão inteira é executada e a expressão 1/2retorna 0.

Esse comportamento é "normal" no Python 2.x, enquanto no Python 3.x é 1/2avaliado como 0.5. Se você deseja que seu código Python 2.x se comporte como a gravação 3.x wrt division from __future__ import division- então 1/2avaliará a 0.5compatibilidade retroativa e 1//2avaliará a 0.

E para o registro, a maneira preferida de calcular uma raiz quadrada é esta:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

É uma adição trivial à cadeia de respostas. No entanto, como o Assunto é um hit muito comum no Google, isso merece ser adicionado, acredito.


11

/ executa uma divisão inteira no Python 2:

>>> 1/2
0

Se um dos números for flutuante, ele funcionará conforme o esperado:

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

7

O que você está vendo é divisão inteira. Para obter a divisão de ponto flutuante por padrão,

from __future__ import division

Ou você pode converter 1 ou 2 de 1/2 em um valor de ponto flutuante.

sqrt = x**(1.0/2)

2

Pode ser um pouco tarde para responder, mas a maneira mais simples e precisa de calcular a raiz quadrada é o método de Newton.

Você tem um número que deseja calcular sua raiz quadrada (num)e adivinhar sua raiz quadrada (estimate). A estimativa pode ser qualquer número maior que 0, mas um número que faça sentido reduz significativamente a profundidade da chamada recursiva.

new_estimate = (estimate + num / estimate) / 2

Esta linha calcula uma estimativa mais precisa com esses 2 parâmetros. Você pode passar o valor new_estimate para a função e calcular outro new_estimate que seja mais preciso que o anterior ou pode fazer uma definição de função recursiva como esta.

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)

Por exemplo, precisamos encontrar a raiz quadrada dos anos 30. Sabemos que o resultado está entre 5 e 6.

newtons_method(30,5)

número é 30 e estimativa é 5. O resultado de cada chamada recursiva é:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

O último resultado é o cálculo mais preciso da raiz quadrada do número. É o mesmo valor que a função interna math.sqrt ().


1

Talvez seja uma maneira simples de lembrar: adicione um ponto após o numerador (ou denominador)

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

0

Você pode usar o NumPy para calcular raízes quadradas de matrizes:

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

1
Essa é uma maneira mais natural de criar raízes quadradas, mas como ela responde à pergunta (é verdade que responde à pergunta no título, mas não à pergunta real no corpo (sim, é um título ruim))?
22818 Peter Mortensen

-1

Espero que o código abaixo mencionado responda à sua pergunta.

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) 

Por favor, editar e adicionar uma breve explicação de por que isso funciona. Apenas o código não é muito útil.
Wjandrea 04/07/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.