Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is the last number wrong?

Tags:

java

math

double

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.

like image 894
Alvar Avatar asked Jun 09 '11 13:06

Alvar


1 Answers

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

like image 165
Sven Marnach Avatar answered Dec 07 '22 18:12

Sven Marnach