我一直在想这个问题.正如标题所说,哪个更快,实际功能还是简单地提升到半功率?
UPDATE
这不是过早优化的问题.这只是底层代码实际工作原理的问题.Python代码的工作原理是什么?
我发送了Guido van Rossum电子邮件,因为我真的很想知道这些方法的不同之处.
在Python中至少有3种方法可以做平方根:math.sqrt,'**'运算符和pow(x,.5).我只是好奇每个实现的差异.谈到效率哪个更好?
pow和**是等价的; math.sqrt不适用于复数,也不适用于C sqrt()函数的链接.至于哪一个更快,我不知道......
为什么Python会给出"错误"的答案?
x = 16
sqrt = x**(.5)
returns 4
sqrt = x**(1/2)
returns 1
Run Code Online (Sandbox Code Playgroud)
是的,我知道import math并使用sqrt.但我正在寻找上述答案.
在python或标准库中是否存在整数平方根?我希望它是准确的(即返回一个整数),并且如果没有解决方案则吠叫.
目前我推出了自己的天真的:
def isqrt(n):
i = int(math.sqrt(n) + 0.5)
if i**2 == n:
return i
raise ValueError('input was not a perfect square')
Run Code Online (Sandbox Code Playgroud)
但它很难看,我不相信大整数.如果我超过了这个值,我可以遍历正方形并放弃,但我认为做这样的事情会有点慢.另外我想我可能正在重新发明轮子,这样的东西肯定已经存在于python ......
简单的语法问题.
在数学中,如果我有两个数字3和2,我希望计算3到2的幂,那么不需要符号,但我写了两个小.在Python这个操作中似乎用**语法表示.
>>> 3**2
9
Run Code Online (Sandbox Code Playgroud)
如果我想转向另一个方向并计算9的第2根,那么在数学中我需要使用符号:

在Python中是否有一个简写符号,类似于**实现这一点即2<symbol>9.或者我需要使用该math模块吗?
decimal.Decimal(math.sqrt(2))屈服时我很失望
Decimal('1.4142135623730951454746218587388284504413604736328125')
Run Code Online (Sandbox Code Playgroud)
并且小数点后15位的数字错误.(尽管很乐意给你超过15位数!)
如何在Python 的十进制扩展中获得第一个m 正确的数字sqrt(n)?
我想找到小于或等于n的第k个根的最大整数.我试过了
int(n**(1/k))
Run Code Online (Sandbox Code Playgroud)
但是对于n = 125,k = 3,这给出了错误的答案!我碰巧知道5立方是125.
>>> int(125**(1/3))
4
Run Code Online (Sandbox Code Playgroud)
什么是更好的算法?
背景:2011年,这次失误让我击败Google Code Jam.https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2
如何重载float我的类的内置float()函数,所以当我调用它的实例时,我的自定义函数被调用而不是默认的内置函数?
嗨,我正在编写自己的Fractions类(对于任意高的浮点运算精度).它是这样的(我还没有完成):
class Fractions:
"""My custom Fractions class giving arbitarilly high precision w/ floating-point arithmetic."""
def __init__(self, num = 0, denom = 1):
"""Fractions(num = 0, denom = 1) -> Fractions object
Class implementing rational numbers. In the two-argument form of the constructor, Fraction(8, 6) will produce a rational number equivalent to 4/3.
Both arguments must be rational, i.e, ints, floats etc. .The numerator defaults to 0 and the denominator defaults to …Run Code Online (Sandbox Code Playgroud) 当我取-1的平方根时,它给出了一个错误:
sqrt中遇到无效值
我该如何解决这个问题?
/////////
arr=sqrt(-1)
print(arr)
OUTPUT
Run Code Online (Sandbox Code Playgroud) 有什么区别x**(1/2),math.sqrt()和cmath.sqrt()?
为什么cmath.sqrt()单独得到二次方的复杂根?我应该专门用于我的平方根吗?他们在背景中的做法有何不同?
我正在使用python中的200位数字.当使用math.sqrt(n)找到数字的平方根时,我得到了错误的答案.
In[1]: n=9999999999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999998292000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000726067
In[2]: x=int(math.sqrt(n))
In[3]: x
Out[1]: 10000000000000000159028911097599180468360808563945281389781327
557747838772170381060813469985856815104L
In[4]: x*x
Out[2]: 1000000000000000031805782219519836346574107361670094060730052612580
0264077231077619856175974095677538298443892851483731336069235827852
3336313169161345893842466001164011496325176947445331439002442530816L
In[5]: math.sqrt(n)
Out[3]: 1e+100
Run Code Online (Sandbox Code Playgroud)
由于x*x(201位)大于n(200位),因此x的值大于预期值.这里发生了什么?是否有一些概念我在这里错了?我怎么能找到大数字的根?
为什么math模块返回错误的结果?
A = 12345678917
print 'A =',A
B = sqrt(A**2)
print 'B =',int(B)
Run Code Online (Sandbox Code Playgroud)
结果
A = 12345678917
B = 12345678917
Run Code Online (Sandbox Code Playgroud)
到这里,结果是正确的。
A = 123456758365483459347856
print 'A =',A
B = sqrt(A**2)
print 'B =',int(B)
Run Code Online (Sandbox Code Playgroud)
结果
A = 123456758365483459347856
B = 123456758365483467538432
Run Code Online (Sandbox Code Playgroud)
这里的结果是不正确的。
为什么会这样?
我想在Python中计算一个大于10 ^ 2000的数字的平方根.如果我将此数字视为普通整数,我将始终得到此结果:
Traceback (most recent call last):
File "...", line 3, in <module>
print( q*(0.5) )
OverflowError: int too large to convert to float
Run Code Online (Sandbox Code Playgroud)
我该如何解决?或者除了使用Python之外是否存在计算此平方根的可能性?
python ×12
math ×7
sqrt ×4
algorithm ×1
integer ×1
long-integer ×1
numpy ×1
operators ×1
overloading ×1
performance ×1
python-3.x ×1
square-root ×1