Ach*_*les 2 java algorithm logic
是否存在传递法不能成立的对象或原始类型; 例如
A == B,B == C但A!= B.
我不是在谈论equals()方法.我对==操作感兴趣
我们能证明这一点吗?
干得好.A==B
并B==C
导致Float
s被提升为float,因此==
返回true.但是,A==C
引用相等,这是错误的.
Float A = new Float(1.0f);
float B = 1.0f;
Float C = new Float(1.0f);
System.out.println(A==B);
System.out.println(B==C);
System.out.println(A==C);
Run Code Online (Sandbox Code Playgroud)
Float
在这里并不特别,它可以很容易Integer
或Boolean
.
以下是语言规范的相关部分:
15.21.1.数值等式算子==和!=
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字提升(第5.6.2节).
和
15.21.3.参考等式运算符==和!=
如果等于运算符的操作数既是引用类型又是null类型,则操作是对象相等.
这是第二个反例,这次使用比较a long
和float
使用float
比较完成的事实.
long a = 99999999999999L;
float b = 99999999999999.0f;
long c = 99999999999998L;
System.out.println(a==b);
System.out.println(b==c);
System.out.println(a==c);
Run Code Online (Sandbox Code Playgroud)
第三,我认为即使A,B和C属于同一类型,理论上也可能存在非传递性.
如果A和C是双扩展指数值(与它们的最接近的两倍具有相同的值B),那么当计算A == B和B == C时,语言实现可以选择舍入A和C到它们最近的双精度值(即B).它也可能选择不在进行A == C到圆.比较必须在未标记为FP严格的上下文中完成
基本上"5.1.13.值集转换"为Java提供了非FP严格浮点/双精度计算的有限实现定义行为集,并且可以利用这一点(至少在理论上)来找到相等的反例传递.
归档时间: |
|
查看次数: |
527 次 |
最近记录: |