我做了这样的代码:
final int DATA_TYPE; // 0: Letter; 1: Number; 2: Symbol; ...
为什么这个java代码不起作用。我将一个工作的cpp代码翻译成了java版本。但它失败了:
输入:34.00515,-3输出:1.00000预期:0.00003
P.S。 这是工作的cpp版本:
public static double myPow(double x, int n){
if(n==0) return 1;
double t = myPow(x, n/2);
if(n % 2 != 0){
if(n < 0){
return (1 / t * t * x);
} else {
return t * t * x;
}
} else {
return t * t;
}
}
答案 0 :(得分:1)
您正在考虑n
案例中n % 2 != 0
是否为否定,但else
案例中是否为n
。为了更清楚,我会在一个不同的递归情况下处理它。从if
块中取消负if(n == 0)
处理,并在if (n < 0) return 1 / myPow(x, -n);
行之后添加此行。
return (1 / t * t * x);
这也消除了你在这一行中所做的整数除法:t
。它还有一个误差,你将除以t
,乘以x
,再乘以(WebBrowser.Document as IHTMLDocument2).body.innerHTML := xHtml;
ovTable := WBT.OleObject.Document.all.tags('TABLE').item(1);
,而不是除以整个产品。
答案 1 :(得分:0)
发现这比你的解决方案在更高的功率下更快:
public static double posIntPow(final double pVal, final int pPow) {
double ret = 1;
double v1, v2;
int n = pPow;
v1 = pVal;
if ((n & 1) == 1) {
ret = pVal;
}
n = n >>> 1;
while (n > 0) {
v2 = v1 * v1;
if ((n & 1) == 1) {
ret = ret * v2;
}
v1 = v2;
n = n >>> 1;
}
return ret;
}
比普通的Math lib快10倍 - 虽然这显然只是整数。可以使用您用于否定的相同测试。