Python'da kare kökü nasıl hesaplayabilirim?


140

Python neden "yanlış" cevabı veriyor?

x = 16

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

Evet, biliyorum import mathve kullanıyorum sqrt. Ama yukarıdakilere bir cevap arıyorum.


31
Python 3'te deneyin, düzeltildi;)
Mark Ransom

2
Python ile kare kökü hesaplayın import mathve sonra x = math.sqrt(25)değeri 5.0x'e atayacaktır .
Eric Leschinski

1
@Merlin - lütfen başlıktaki değişiklikleri geri almayın. Sorunun bulunmasını kolaylaştırır.
ChrisF

2
@ChrisF - bu benim sorum, çok sayıda sorunu çözüyor. Başlığı ve içeriği değiştirmeyi durdurun.
Merlin

Yanıtlar:


246

sqrt=x**(1/2)tamsayı bölme yapıyor. 1/2 == 0.

Yani ilk etapta x (1/2) , ikincisinde x (0) hesaplıyorsunuz .

Bu yanlış değil, farklı bir sorunun doğru cevabı.


64
"Yani bu yanlış değil, farklı bir soruya doğru cevap" - love it! - bu ifadeyi daha sık kullanmak için kendime meydan okuyabileceğimi düşünüyorum!
Thomas Kimber

6
Python 3.6'da ilk sorduğunuz soruya doğru cevabı alırsınız.
vwvan

2
İkinci yöntem şu şekilde hesaplanabilir:sqrt = x**(float(1)/2)
VM_AI

117

Yazmalısınız: sqrt = x**(1/2.0)aksi takdirde bir tamsayı bölümü gerçekleştirilir ve ifade 1/2geri döner 0.

Bu davranış Python 2.x içinde "normal" iken Python 3.x için olarak 1/2değerlendirilir 0.5. Python 2.x kodunuzun 3.x wrt bölüm yazma gibi davranmasını istiyorsanız from __future__ import division- o 1/2zaman 0.5geriye ve geriye doğru uyumluluk için 1//2değerlendirme yapar 0.

Ve kayıt için, bir kare kökü hesaplamanın tercih edilen yolu şudur:

import math
math.sqrt(x)

24
import math
math.sqrt( x )

Cevap zincirine önemsiz bir ektir. Ancak Konu çok yaygın google hit olduğundan, bu eklenmeyi hak ediyor inanıyorum.


11

/ Python 2'de bir tamsayı bölümü gerçekleştirir:

>>> 1/2
0

Sayılardan biri bir kayan nokta ise, beklendiği gibi çalışır:

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

7

Gördüğünüz şey tamsayı bölümüdür. Varsayılan olarak kayan nokta bölümünü almak için,

from __future__ import division

Veya 1/2'in 1 veya 2'sini bir kayan nokta değerine dönüştürebilirsiniz.

sqrt = x**(1.0/2)

2

Bu cevaplamak için biraz geç olabilir, ancak karekök hesaplamanın en basit ve doğru yolu newton'un yöntemidir.

Karekökünü hesaplamak istediğiniz bir sayınız ve karekökünü (num)tahmin edersiniz (estimate). Tahmin, 0'dan büyük herhangi bir sayı olabilir, ancak anlamlı olan bir sayı, yinelemeli çağrı derinliğini önemli ölçüde kısaltır.

new_estimate = (estimate + num / estimate) / 2

Bu çizgi, bu 2 parametre ile daha doğru bir tahmin hesaplar. İşleve new_estimate değerini iletebilir ve öncekinden daha doğru olan başka bir new_estimate hesaplayabilir veya bunun gibi özyinelemeli bir işlev tanımı yapabilirsiniz.

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)

Örneğin 30'un karekökünü bulmamız gerekiyor. Sonucun 5 ile 6 arasında olduğunu biliyoruz.

newtons_method(30,5)

sayı 30 ve tahmin 5'tir. Her yinelemeli çağrının sonucu:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

Son sonuç, sayının kare kökünün en doğru hesaplanmasıdır. Yerleşik math.sqrt () işleviyle aynı değerdir.


1

Belki de hatırlamanın basit bir yolu: paydan (veya paydadan) bir nokta ekleyin

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

0

Dizilerin kare köklerini hesaplamak için NumPy'yi kullanabilirsiniz:

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

1
Bu, kare kökleri yapmanın daha doğal bir yoludur, ancak soruyu nasıl cevaplar (kuşkusuz başlıktaki soruya cevap verir, ancak vücuttaki gerçek soru değil (evet, kötü bir başlıktır))?
Peter Mortensen

-1

Umarım aşağıda belirtilen kod sorunuza cevap verecektir.

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) 

Lütfen bunun neden işe yaradığına dair kısa bir açıklama düzenleyin ve ekleyin. Sadece kod çok yararlı değil.
wjandrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.