开发者

Why is the last number wrong?

Why is only the last number wrong in the output this code:

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello world");
        System.out.println("I wounder is the sqaure root of (2*3) the 
                           same as the sqaure root of 2 and 3 multiplied.");
        double squareroot0 = Math.pow(3*2, 0.5);
        double squarroot1 = (Math.pow(3, 0.5) * Math.pow(2, 0.5)); 
        System.out.println("So is it the same?");

        System.out.println("is " + squareroot0 + " the equvielant of " + 
                                               squarroot1 + "?");
        if(squareroot0 == squarroot1) {
            System.out.println("Yes number one and number two are 
                                               the same, Congrats!");
        }else {
 开发者_如何学Go           System.out.println("No they are not! ");
        }

        System.out.println(squareroot0);
        System.out.println(squarroot1);


    }
}

Output:

Hello world
I wonder is the sqaure root of (2*3) the same as the sqaure 
root of 2 and 3 multiplied.
So is it the same?
is 2.449489742783178 the equvielant of 2.4494897427831783?
No they are not! 
2.449489742783178
2.4494897427831783

Mathematically they are equivalent, so what is going on?

Math.sqrt() and Math.pow(,0.5) is just as accurate.


You can't represent numbers with infinite precision in a finite computer, so you need to round. What you see is the effect of rounding. This is inherent to all uses of floating point numbers.

Mandatory link: What Every Computer Scientist Should Know About Floating-Point Arithmetic


Rounding errors occur frequently when computing with floating point values, due to slight differences in the order of things. If you had infinite precision this would never be a problem, but computers won't offer that any time soon.

Your best bet is to decide the number of digits of precision that matter to you and clip or round your values before comparing them for equality.


Rounding errors due to limitations of float/double.

You'd want to define some margin of error, then so long as they're within it, treat them as equal.

float f = getFirst();  
float g = getSecond();  
float epsilon = 0.000005;  //Choose something suitably small
if(f-g > epsilon)  
    //equal


Floating point numbers like doubles have limited precision, so they round somewhat arbitrarily, which makes some operations difficult. I would either chop off the end of the numbers and then compare them, or find the difference between them and check if that difference is less than a small margin of error (e.g. .0000000001)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜