我在移植一些C ++代码到Java的中间,我不断延伸跨越谁写它一直在做下列情况下运行:

double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));

代替:

double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));

第二个看起来更清晰,除非我错了有关C这样的操作顺序++他们应该做同样的事情。有一些原因,首先要做的,而不是第二个?我能想到的唯一的事情是一些奇怪的情况下精确。

有帮助吗?

解决方案

是的,它们是相同的。我能想到的唯一理由是数学清晰:有时,当你进行归一化量,你经常写:

answer = (1/total) * (some of it)

例如,柯西积分定理通常写作

f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)

其他提示

如果a保持不变,b正在发生变化(比如,如果你的代码是一个循环,很明显,因为它是一个a变量const并不两次迭代之间的改变,例如),那么原来的版本可以更快地执行,因为乘法比除法便宜(假定编译器移动1/...的计算出循环)。

这似乎是在如果是这样的原因,优化引入歧途的企图,但并不意味着它是不是。

哦,关于精度,原始版本实际上略微比你的不太精确的,如果有的话,因为存在用于1/...额外的舍入误差。正是这种舍入误差是可以防止编译器将您的版本到它自己的意志的原始版本:他们没有计算完全一样的东西(但非常接近的东西)

是的,他们应该做同样的事情。原作者可能已被复制的方程以极其中

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top