python中如何求立方根或者N方根啊?

6,312 views
Skip to first unread message

Zengming Zhang

unread,
Sep 23, 2010, 7:12:04 AM9/23/10
to "python-cn`CPyUG`华蟒用户组(中文Py用户组)"
各位好,如题,我作了下面的尝试:

1. 在python的文档里面找可以直接求方根的函数, 只有平方根的 sqrt , 再高的就没了。
2. 27的立方根可以理解为 27 的 1/3 次方, 于是:

        >>> math.pow(27, 1.0/3)
        3.0
        >>> 27 ** (1.0/3)
        3.0
    但是对于 64, 得到的结果就不是 4 了:
        >>> math.pow(64, 1.0/3)
        3.9999999999999996
        >>> 64 ** (1.0/3)
        3.9999999999999996
        >>>
    对于 125, 结果也不是 5:
        >>> 125 ** (1.0/3)
        4.9999999999999991
        >>>

请问有什么办法可以精确的求N次方根吗?

--
Zengming Zhang (niceg...@gmail.com)
ZCNI, ZheJiang University

HYRY

unread,
Sep 23, 2010, 7:54:14 AM9/23/10
to python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
我想因为用浮点数无法精确表达1.0/3,因此你给出的几个例子会有误差。

如果你需要完全精确的符号运算的话,可以用SymPy:

In [1]: pow(27,S(1)/3)
Out[1]: 3

In [2]: pow(125,S(1)/3)
Out[2]: 5

In [4]: pow(125,S(1)/4)
Out[4]:
3/4
5

> Zengming Zhang (nicegiv...@gmail.com)
> ZCNI, ZheJiang University <http://systemsbiozju.org/people/zzm>

zhao shichen

unread,
Sep 26, 2010, 6:56:56 PM9/26/10
to pyth...@googlegroups.com
math.pow用的技术是多项式展开一类的,自然得到的是浮点,

符号计算应该可以得到精确地值


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn-...@googlegroups.com (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
呆痴木讷,君子四德

ubunoon

unread,
Sep 26, 2010, 7:08:21 PM9/26/10
to pyth...@googlegroups.com
计算机不是人类,对于浮点数的计算存在误差,  3.9999999999999996和4已经相差无几了。更何况,对于有些数据,用浮点数根本就没有办法完全一致表示。

pow是浮点数计算,因此,这几个答案还是正确的。

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn-...@googlegroups.com (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
To be pythoner
My blog: http://www.cnblogs.com/ubunoon/
http://zjyuezz.cn.alibaba.com/

老光

unread,
Sep 26, 2010, 8:14:53 PM9/26/10
to pyth...@googlegroups.com
如果恰好是一个立方数,那么当然可以"精确"地求立方根,只须倒扣回去验证一次就行了.
如果不幸不是一个立方数,那么,结果就是一个无限位的小数,任你用什么电脑,都表达不出来的,死机是你唯一的出路...
 
def try_pow(a,b):
    c = a**b
    if int(c+0.5)**(1.0/b) == a:
        return c
    else:
        raise
 
不过,这个方法不适用小数:
>>> 0.125
0.125
>>> 0.8
0.80000000000000004
>>>

zhao shichen

unread,
Sep 26, 2010, 10:58:35 PM9/26/10
to pyth...@googlegroups.com
友情提示:

>>> 0.1
0.10000000000000001
呆痴木讷,君子四德

机械唯物主义 : linjunhalida

unread,
Sep 26, 2010, 11:01:16 PM9/26/10
to pyth...@googlegroups.com
IEEE浮点数本身就没有办法精确表示所有浮点数的..
这是本质问题, 除非你不用IEEE浮点数, 自己做一个精确的数据结构.

智障

unread,
Sep 26, 2010, 11:08:42 PM9/26/10
to pyth...@googlegroups.com

jun ji

unread,
Sep 26, 2010, 11:11:39 PM9/26/10
to pyth...@googlegroups.com
找找其他的科学计算数学包吧

双木成林

unread,
Sep 26, 2010, 11:52:51 PM9/26/10
to pyth...@googlegroups.com
对于浮点数的运算,我觉得首先就是确定精度啊。
判断两个浮点数是否相等,只要用 (a - b) < 0.00001就可以认为是相等的。这个0.00001就是精度。
要自己实现一套比较的判断。

-----------------------------------
Where Python Happens!

mail: linlu...@gmail.com
twitter: @linluxiang

jun ji

unread,
Sep 26, 2010, 11:56:04 PM9/26/10
to pyth...@googlegroups.com
他想要做的是用来进行数学计算,而不是数值计算,浮点表示不适合。

Ben Bear

unread,
Sep 26, 2010, 11:56:59 PM9/26/10
to pyth...@googlegroups.com
在 2010年9月27日 上午11:52,双木成林 <linlu...@gmail.com>写道:
对于浮点数的运算,我觉得首先就是确定精度啊。
判断两个浮点数是否相等,只要用 (a - b) < 0.00001就可以认为是相等的。这个0.00001就是精度。
这个又说远了~~两个非 0 浮点数做相等比较,应该是两个数的“比值”与 1 相差不超过 1E-6(或更精确)

Pan Shi Zhu

unread,
Sep 27, 2010, 1:50:58 AM9/27/10
to pyth...@googlegroups.com

2010/9/27 双木成林 <linlu...@gmail.com>

对于浮点数的运算,我觉得首先就是确定精度啊。
判断两个浮点数是否相等,只要用 (a - b) < 0.00001就可以认为是相等的。这个0.00001就是精度。
要自己实现一套比较的判断。

这么做不能得到正确结果的,因为多次计算会将误差逐渐放大。

假如 a,b,c,d 都比实际值多了0.00001,把这四个数相加,就多了0.00004

更特别的: a*10000+b,此后的结果,偏离了0.10001,而不是 0.00001

在实际编程中,我几乎没有看到所谓【用精度来判断浮点数相等】能被运用的地方。


zhao shichen

unread,
Sep 27, 2010, 4:00:15 AM9/27/10
to pyth...@googlegroups.com
guile用过,不错,很好玩;

计算机有两种用处,一种是科研,一种是计算。

在通常场景下,是计算,所以。。。。

--
呆痴木讷,君子四德

双木成林

unread,
Sep 27, 2010, 4:04:14 AM9/27/10
to pyth...@googlegroups.com
嗯。这里的确是我考虑不周。
不过处理浮点数问题可以考虑Decimal模块。

ShiaoMing Young

unread,
Oct 4, 2010, 8:46:24 AM10/4/10
to pyth...@googlegroups.com
>>> math.pow(64, 1.0/3)
3.9999999999999996

>>> print math.pow(64, 1.0/3)
4.0

2010/9/23 Zengming Zhang <niceg...@gmail.com>
--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn-...@googlegroups.com (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
Vealous: http://i.shiao.org
Twitter: @lepture
Reply all
Reply to author
Forward
0 new messages