Alok Y
Alok Y

Reputation: 103

Incorrect output when computing the distance in kilometres of the Great Circle using Haversine formula in Java

I'm trying to compute the distance in kilometres of the Great Circle using Haversine formula in Java as shown below

/* Program to demonstrate the Floating-point numbers and the Math library.
 * The great-circle distance is the length of the shortest path between two points (x1,y1) and (x2,y2) on the surface of a sphere, where the path is constrained to be along the surface.*/
public class GreatCircle 
{
    public static void main(String[] args) 
    {
        double r = 6371.0; // Equatorial radius of the Earth
        double x1 = Math.toRadians(Double.parseDouble(args[0]));
        double y1 = Math.toRadians(Double.parseDouble(args[1]));
        double x2 = Math.toRadians(Double.parseDouble(args[2]));
        double y2 = Math.toRadians(Double.parseDouble(args[3]));

        // Compute using Haversine formula
        double distance = 2 * r * Math.asin(Math.sqrt(Math.pow(Math.sin((x2 - x1) / 2),2 + Math.cos(x2) * Math.pow(Math.sin((y2 - y1) / 2),2)));

        // Output the distance
        System.out.println(distance + " kilometers ");
    }
}

I'm running with input java GreatCircle 60.0 15.0 120.0 105.0. The expected output is 4604.53989281927 kilometers, But I get 13406.238676180266 kilometers. Could someone please point out where am I going wrong?

Upvotes: 2

Views: 946

Answers (3)

marypeng1020
marypeng1020

Reputation: 21

double distance = 2 * r * Math.asin(Math.sqrt(Math.pow(Math.sin((x2 - x1) / 2),2)
            + Math.cos(x2) * Math.cos(x1) * Math.pow(Math.sin((y2 - y1) / 2),2)));

Upvotes: 0

Ragip Gashi
Ragip Gashi

Reputation: 41

You have forgotten to calculate Math.cos(x1) * Math.cos(x2), that's why you get a different result.

// Compute using Haversine formula<br>
double distance = 2 * r * Math.asin(Math.sqrt((Math.pow(Math.sin((x2 - x1) / 2),2) + Math.cos(x1) * Math.cos(x2) * Math.pow(Math.sin((y2 - y1) / 2),2))));```

Upvotes: 0

Alok Y
Alok Y

Reputation: 103

The formula was implemented incorrectly. It worked after making the following corrections. In the formula, we are taking the arc sin of the entire expression.


        // Compute using Haversine formula
        double distance = 2 * r * Math.asin(Math.sqrt(Math.pow(Math.sin((x2 - x1) / 2),2 + Math.cos(x2) * Math.pow(Math.sin((y2 - y1) / 2),2)));

        // Output the distance
        System.out.println(distance + " kilometers ");
    }
}

Upvotes: 1

Related Questions