Advertisement
francogp

Pi

Feb 12th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.91 KB | None | 0 0
  1. import java.awt.Point;
  2. import java.util.stream.LongStream;
  3.  
  4. /**
  5.  *
  6.  * @author Franco
  7.  */
  8. public class Pi {
  9.  
  10.     /**
  11.      * @param args the command line arguments
  12.      */
  13.     public static void main(String[] args) {
  14.         // ancho de la "matriz" en "pixeles". El numero debe ser par para que el radio sea impar
  15.         // y la ecuacion final para calcular el perimetro tenga sentido y no se repitan "pixeles"
  16.         Long ancho = 1_000_000l;
  17.         // el radio es 1 "pixeles" menor a la "matriz" para evitar problemas de redondeo
  18.         Long radio = ancho - 1;
  19.  
  20.         System.out.println("Corriendo simulacion con Long y Double");
  21.  
  22.         // recorremos la "matriz" y sumamos los "pixeles" que estan a una distancia
  23.         // igual al radio del circulo. Los demas son ignorados.
  24.         // Para ahorrar calculos, solo computamos 1 cuarto de circulo y luego multiplicamos por 4
  25.         Long cantPuntos = LongStream.range(0, ancho)
  26.                 .parallel()
  27.                 .map(x -> {
  28.                     return LongStream.range(0, ancho)
  29.                     .parallel()
  30.                     .filter(y -> {
  31.                         double hipotenusa = Point.distance(0, 0, x, y);
  32.                         //ignomramos los pixeles que se van a superponer caudno multipliquemos
  33.                         // por 4 esta porcion del perimetro
  34.                         return x != 0 && y != 0 && Math.abs(hipotenusa - radio) < 0.5;
  35.                     }
  36.                     ).count();
  37.                 }
  38.                 ).sum();
  39.  
  40.         double perimetro = (cantPuntos * 4 + 4); //sumamos los 4 "pixeles" que ignoramos en los calculos anteriores
  41.         double diametro = (radio * 2);
  42.         double pi = perimetro / diametro;
  43.         System.out.println("perimetro = " + perimetro);
  44.         System.out.println("diametro = " + diametro + " , radio = " + radio);
  45.         System.out.println("pi = " + pi);
  46.     }
  47.  
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement