2015-10-30 2 views
1

Я написал краткую программу на Java, чтобы попытаться найти приблизительные значения для Pi, используя доли целых чисел. Однако, похоже, он вообще ничего не делает. Что я хочу делать. Фактически, он, кажется, ничего не делает, и просто повторно распечатывает жестко заданные начальные значения.Аппроксимация Pi - Почему этот код не работает?

Чтобы понять, что происходит не так, я перевел свой код на Python, потому что я только изучаю Java, но вполне комфортно в Python. Однако по какой-то причине он работает точно так, как я предполагал. Должно быть, я прочитал обе версии кода не менее 10 раз, и я не понимаю, почему один работает, а другой нет.

Во всяком случае, вот мой код в Java:

public class RationalPi { 
    public static void main(String[] args) { 
     int arg; 
     if (args.length>0) { arg = Integer.parseInt(args[0]); } 
     else { arg = 10000; } 
     int numer = 3; 
     int denom = 1; 
     double pi = numer/denom; 
     for (int i=numer; i<=arg; i++) { 
      for (int j=i/4; j<=i/2; j++) { 
       if (j==0) { continue; } 
       double newPi = i/j; 
       if (Math.abs(newPi-Math.PI) < Math.abs(pi-Math.PI)) { 
        System.out.println("found better approximation"); 
        numer = i; 
        denom = j; 
        pi = newPi; 
       } 
      } 
      System.out.println(String.format("%d /%2d == %f", numer, denom, pi)); 
     } 
    } 
} 

И вот что я считаю, должны быть функционально идентичны код в Python:

from math import pi as PI 

def findApproximate(arg=10000): 
    numer, denom = 3, 1 
    pi = numer/denom 
    for i in range(numer, arg+1): 
     for j in range(int(i/4), int((i/2)+1)): 
      if not j: 
       continue 
      newPi = i/j 
      if abs(newPi-PI) < abs(pi-PI): 
       print("Found better approximation") 
       numer, denom, pi = i, j, newPi 
     print("%d/%d == " % (numer, denom) + str(pi)) 
    return pi 

Но по какой-то причине это прекрасно работает в то время как выше Безразлично» т, и это заставляет меня абсолютно бонкеров. Пожалуйста, помоги, если можешь.

+2

Подсказка: 'int/int = int' (а не' double'). – Seelenvirtuose

+0

Вы используете это в среде IDE или из командной строки? убедитесь, что вы правильно настроили свои аргументы, потому что если arg = 0, то это даст вам результат, который вы найдете. – dodo

+0

@Seelenvirtuose: bingo, это проблема OP, потому что Java-программа отбрасывает фракции * до *, чтобы удвоить. – user268396

ответ

4

Эта линия деления целых чисел, а затем хранит (усеченный) приводит к двойному

double newPi = i/j; 

бросил одну из переменных в два раза, если вы хотите точный результат

double newPi = (double) i/j; 

то же самое с

double pi = numer/denom; 
+0

спасибо, я знал, что это должно быть что-то глупое. Теперь я буду стыдиться себя. – Axim

Смежные вопросы