考虑以下循环,到目前为止,我还没有声明过:
while (i == i + 1) {}
找到i
在此循环之前的的定义,以便while循环永远持续下去。
下一个问题,针对此代码段询问了相同的问题:
while (i != i) {}
对我来说很明显 当然,在其他情况下也是如此,NaN
但我确实被先前的情况所困扰。这和溢出有关吗?什么会导致这样的循环在Java中永远循环?
@Raedwald学习“非专业”代码会使您更“专业”,所以...无论如何,这是一个好问题
—
Andrew Tobilko
有趣的是,在C#中,这也适用于可为空的数字类型,其值是
—
埃里克·利珀特
null
,因为它null == null
是true,并且null + 1
是null
。
@EricDuminil:情况比您想象的要糟得多。在许多语言中,浮点算术必须至少以double所指定的64位精度来完成,这意味着可以在编译器心血来潮时以更高的精度来完成浮点算术,并且在实践中会发生这种情况。我可以为您指出该站点上来自C#程序员的十二个问题,他们想知道为什么要
—
埃里克·利珀特
0.2 + 0.1 == 0.3
根据编译器设置,月相等等来更改其值。
@EricDuminil:造成这种混乱的原因归咎于英特尔,英特尔给了我们一套芯片组,如果可以注册数字,它可以执行更高精度和更快的浮点运算,这意味着浮点计算的结果可以根据其值进行更改。当前优化器中的寄存器调度程序的运行情况。然后,您作为语言设计师的选择是在可重复计算与快速,精确计算之间进行,而关心浮点数学的社区将选择后者。
—
埃里克·利珀特
.equals()
方法的可能性?由于我未声明,因此我们可以使用所需的任何类。