代数运算在Java中的异常计算

JAVA编程语言会遵循由括号显示表示和操作符优先级隐士表示的计算顺序。

Java编程语言的实现不应该利用代数特性,例如应用结合律来重写表达式,使其具有更方法的计算顺序,除非可以证明代替表达式与被代替的表达式在取值上和在可观察的副作用上是等价的,即使在面临多线程执行时也是如此,而且对于所有可能涉及其中的计算值都是如此。

在计算浮点的情况中,这条规则也会应用与无穷值和非数字NaN值。

例如:!(x<y)不能写作x>=y,因为如果x或者yNaN,那么这些表达式具有不同的值。

特别的,看起来满足数据上的结合律的浮点计算,不可能满足计算结合律,这种计算必须不能被朴素的重排序。

例1:

public class MainTest1 {

	public static void main(String[] args) {
		double d=8E+307;
		System.out.println(4.0*d*0.5);
		System.out.println(2.0*d);
	}
}

执行结果:
Infinity
1.6E308

因为第一个表达式上溢了,而第二个不会。

相比之下,整数加法和乘法在java编程语言中可证明是满足结合律的。

例如表达式a+b+c,其中abc都是局部变量,产生的结果总是与(a+b+ca+b+c)计算的结果相同。如果在代码中附近还有表达式b+c,那么java编译器可以使用这个公共子表达式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值