我的教授有一个程序,它接受一个种子和函数,然后递归地输出和输入一个值。
无论如何,有时你可以得到这样的循环。例如,设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%。有人能给我一个技术上的解释吗?
发布于 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#对浮点操作的定义非常奇怪,以至于程序可能会因为即时编译而在一段时间后改变行为,但这可能是唯一一种广泛使用的语言,具有如此可怕的属性。
https://stackoverflow.com/questions/25838763
复制相似问题