Alvar
Alvar

Reputation: 262

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 {
            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.

Upvotes: 9

Views: 585

Answers (4)

carlbenson
carlbenson

Reputation: 3207

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)

Upvotes: 0

Sysyphus
Sysyphus

Reputation: 1061

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

Upvotes: 0

mah
mah

Reputation: 39847

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.

Upvotes: 0

Sven Marnach
Sven Marnach

Reputation: 602635

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

Upvotes: 16

Related Questions