Fast sqrt in Java at the expense of accuracy

后端 未结 3 381
温柔的废话
温柔的废话 2020-12-15 11:23

I am looking for a fast square root implementation in Java for double values in the input range of [0, 2*10^12]. For any value in this range, the precision should be upto 5

3条回答
  •  再見小時候
    2020-12-15 11:47

    Try this

    double d = 289358932.0;
    double sqrt = Double.longBitsToDouble( ( ( Double.doubleToLongBits( d )-(1l<<52) )>>1 ) + ( 1l<<61 ) );
    

    I haven't benchmarked it, but I'd expect it to be faster. The accuracy isn't extremely good, but try it out and see if it meets your needs. I think you can add an additional bias term a to the end of the expression to make it more accurate.

    EDIT: You can drastically improve the accuracy by passing it through a round or two of Newton's method

    double better = (sqrt + d/sqrt)/2.0;
    double evenbetter = (better + d/better)/2.0;
    

    The second pass gives you almost the exact value of the square root.

    sqrt            17022.533813476562
    better          17010.557763511835
    evenbetter      17010.553547724947
    Math.sqrt()     17010.553547724423
    

提交回复
热议问题