sqrt函数在Python中的怪异行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了sqrt函数在Python中的怪异行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2219字,纯文字阅读大概需要4分钟。
内容图文
![sqrt函数在Python中的怪异行为](/upload/InfoBanner/zyjiaocheng/676/3bc01911d94847e2ae7c2370a6c3f7d8.jpg)
在Python中,我编写了一个自定义代码sqrt(x,delta),以delta-close近似值计算给定数字的平方根.它使用while循环和类似于二进制搜索的算法.
编码:
from __future__ import division
def sqrt(x, delta):
start = 0
end = x
while (end-start) > delta:
middle = (start + end) / 2
middle_2 = middle * middle
if middle_2 < x:
start = middle
print "too low"
elif middle_2 > x:
end = middle
print "too high"
else:
return middle
result = (start + end) / 2
return result
它基本上可以运行并且非常快,但是在某些情况下会陷入无限的while循环中.
sqrt(1e27, 1/1024) => works fine (returns 'too low's and 'too high's, then returns correct result)
sqrt(1e28, 1/1024) => works fine
sqrt(1e29, 1/1024) => never-ending loop, it keeps printing 'too low' forever
sqrt(1e30, 1/1024) => works fine
sqrt(1e31, 1/1024) => 'too low' forever
sqrt(1e32, 1/1024) => works fine
sqrt(1e33, 1/1024) => works fine (also surprising after the problem with 1e29 and 1e31)
sqrt(1e34, 1/1024) => works fine
sqrt(1e35, 1/1024) => 'too low' forever
sqrt(1e36, 1/1024) => works fine
sqrt(1e37, 1/1024) => 'too high' forever (too high this time!)
sqrt(1e38, 1/1024) => works fine
sqrt(1e39, 1/1024) => works fine (surprising again..)
... 1e40-1e45 ... they all work fine
sqrt(1e46, 1/1024) => 'too low' forever (surprisingly it occurs now with 1e'even number')
...
sqrt(1e200, 1/1024) => works fine
sqrt(1e201, 1/1024) => works fine
...
sqrt(1e299, 1/1024) => 'too low' forever
sqrt(1e300, 1/1024) => 'too high' forever
...
sqrt(1e304, 1/1024) => 'too high' forever
sqrt(1e305, 1/1024) => works fine
... 305-308 ... they allwork fine
sqrt(1e309, 1/1024) => inf (reached some 'infinite' limit?)
我最初以为数字超出限制,例如1e20.但是后来它也可以使用它们.另外,我曾认为这是大约1e’odd’或1e’even’的数字,但是正如我们在示例中看到的那样,事实并非如此.我还尝试使用不同的增量代替1/1024,但它们表现出相似的行为.
我将不胜感激,因为任何解释都可以说明引起这种现象的幕后原因.
解决方法:
float只可以表示一组有限的数字.您的代码最终会出现以下情况:开始和结束是两个连续的此类数字.结果,必须将(start end)/ 2向下舍入以开始或向上舍入为结束.
如果四舍五入,则middle_2< X.现在,如果结束-开始>三角洲,您有一个“太低”的无限循环.
如果四舍五入,如果结束-开始>增量,您有一个“太高”的无限循环.
您可能应该将增量重新定义为相对误差而不是绝对误差.
内容总结
以上是互联网集市为您收集整理的sqrt函数在Python中的怪异行为全部内容,希望文章能够帮你解决sqrt函数在Python中的怪异行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。