我正在寻找Python第N根函数/算法,但在你发布之前:没有整数根,地狱!
我在哪里至少可以获得一个指导,如何编程N根函数,产生精确的float
/Decimal
?
对于root(125, 1756482845)
**,**不返回1
或0
(第一个参数是数字,第二个参数是根深度(或其他))。
**编辑:**您给我的解决方案是:当我问这个问题的时候我就知道了,但是它不起作用,例如,exp = 3
。你不能用有理数来表达1/3
,所以125 ** (1/3)
给出了错误的结果4.999999...
。我问的是一些“聪明”的算法,该算法对这样的好数给出正确的结果,对有理数exp
给出至少4个小数点的精确结果,如果没有这样的函数或算法,我将使用这个(n ** (1/exp)
)。
6条答案
按热度按时间vfh0ocws1#
我会尝试gmpy2库。
gmpy2
使用MPFR库执行正确舍入的浮点运算。默认精度为53位,但可以提高。免责声明:我维护
gmpy2
。ekqde3dh2#
你可以对答案进行二分查找,如果你想找到X等于N的k次根,你可以对X进行二分查找,在二分查找的每一步都测试X ^k是否等于N +-某个小常数,以避免精度问题。
下面是代码:
对于(N,K)=(125,3),它打印5.0,正确答案,你可以通过改变常量1e-9使它更精确,但是在Python中有一个与浮点变量精度限制相关的精度限制
qvk1mo1f3#
是
math
模块的函数pow
。将返回4的平方根,即
2.0
。对于
root(125, 1756482845)
,您需要做的是sauutmhj4#
你的意思是这样的:
你可能会感兴趣的是bigfloat模块(没有亲自使用过,只是知道它的存在:)-实际上在过去安装它时遇到了问题-可能是OS X的错误)
fhity93d5#
在Squeak Smalltalk中,如果整数接收方是某个整数的n次幂,则存在
nthRoot:
消息,该消息回答精确的Integer
结果,然而,如果解是代数根,则实现不后退到简单的n**(1/exp)
;该方法通过适当地注意残差而舍入到最接近的浮点数。相关代码(MIT许可证)在这里复制。基本算法是搜索一个整数的截断n次方根与一些牛顿-拉夫逊:
这不是特别聪明,因为在指数很大的情况下,收敛速度会很慢,但它很有效,然后,同样的根从零开始四舍五入:
然后在nthRoot中测试精确度:
这也可以应用于Fraction,但是最近的浮点数有点复杂,而且Squeak的实现目前还很幼稚。
它适用于大整数,如:
(10 raisedTo: 600) nthRoot: 300
-〉100
“精确”(10 raisedTo: 600) + 1 nthRoot: 300
-〉100.0
“不精确”如果你没有这样的期望,初始猜测可以使用不精确的朴素
n**(1/exp)
。代码应该很容易移植到Python中,并留有很多优化的地方。
我没有检查Python中有什么可用的,但是也许你需要正确地舍入LargeInteger -〉Float和Fraction -〉Float,就像这里解释的那样(Smalltalk也是,抱歉,但是语言并不重要)。
z8dt9xmd6#
带有num7包的root_i()方法可以计算python3中的精确n次根,如以下3个对大十进制数的计算:
答案: