在java中实现pow而不使用math lib

时间:2015-06-15 22:16:04

标签: java math

我做了这样的代码:

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;
    }
}

2 个答案:

答案 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倍 - 虽然这显然只是整数。可以使用您用于否定的相同测试。