首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在递归循环中,为什么这个值会改变?

在递归循环中,为什么这个值会改变?
EN

Stack Overflow用户
提问于 2014-09-15 06:47:16
回答 1查看 51关注 0票数 0

我的教授有一个程序,它接受一个种子和函数,然后递归地输出和输入一个值。

无论如何,有时你可以得到这样的循环。例如,设f(x) =2xmod1。

在程序中,您可以输入0.2并期望一个循环:(0.2,0.4,0.3,0.6,0.2,...)

但最终他的程序做了一些奇怪的事情..大约在50次迭代中,你得到了0.20001,在那里你应该得到0.2,然后因为这个原因,程序打破了循环,达到了1,然后你得到了所有的输出0之后。

我认为这与计算机如何近似数值有关,但我就是不明白为什么它最终会计算0.20001而不是0.2%。有人能给我一个技术上的解释吗?

EN

回答 1

Stack Overflow用户

发布于 2014-09-15 08:03:21

浮点算术是确定性的(*)。

您认为您看到的是一个初始周期阶段,然后更改为其他值(“0.2,0.4,0.3,0.6,0.2”),但如果您以足够的精度打印这些值(如果您使用的是C或类似C的语言,则使用%.16e格式),您将看到第一个“0.2”与第二个“0.2”不同。

如果任何值在第一阶段中确实重复,那么序列实际上将是周期性的,所有其他值都将无限重复,正如您所预期的那样。

(*),除非您正在使用一种具有实时编译和糟糕的浮点语义的语言进行编程。Java可以即时编译,但浮点操作的含义定义得相当严格,并且操作必须在即时编译之前和之后实现此定义,因此不允许出现这种奇怪的行为。C#对浮点操作的定义非常奇怪,以至于程序可能会因为即时编译而在一段时间后改变行为,但这可能是唯一一种广泛使用的语言,具有如此可怕的属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25838763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档