2015-04-09 8 views
-3
for(int i=n+1;i<=m;i++){ 
      double r = (lm/mu); 
//   double res = (Math.pow(r, i))*(fact(m)/(fact(m-i)*fact(i)))*((Math.pow(n, n-i)*fact(i))/fact(n)) formulae 
      BigDecimal lr= new BigDecimal(Math.pow(r, i)); 
      BigDecimal fnum = new BigDecimal(factorial(m)); 
      BigDecimal fden1 = new BigDecimal(factorial(m-i)); 
      BigDecimal fden2 = new BigDecimal(factorial(i)); 
      fden1=fden1.multiply(fden2); 
      fnum=fnum.divide(fden1); 
      lr=lr.multiply(fnum); 
      BigDecimal nden = new BigDecimal(factorial(n)); 
      BigDecimal inum = new BigDecimal(factorial(i)); 
      BigDecimal mnum = new BigDecimal(Math.pow(n, n-i)); 
      mnum = mnum.multiply(inum); 
      mnum = mnum.divide(nden); 
      lr = lr.multiply(mnum); 
      ssum2 = ssum2.add(lr); 
      sum2=Double.parseDouble(format(ssum2,40)); 

} 

System.out.println("Total 2 is"+sum2); 
+0

Можно ли решить? Что вы хотите сделать? – Neilos

+0

Код только вопросы не одобряются. дать описание ожидаемого поведения и ошибки, которую вы получаете. –

+1

Вы должны добавить намного больше информации. Как то, что вы хотите сделать. – Nitram

ответ

0

Вы разбираете результат с BigDecimal обратно в двойное. Если BigDecimal слишком велик, значение просто бесконечно, потому что double может хранить столько данных.

Редактировать: ошибка Infinity также может возникать в некоторой другой точке кода, и ошибка просто распространяется. Просто проверьте наличие нежелательного приведения из BigDecimal в Double.

+0

double res = (Math.pow (r, i)) * (факт (m)/(факт (mi) * fact (i))) * ((Math.pow (n, ni) * fact (i))/fact (n)) Это формаль, который я реализовал, так как вы можете видеть, но он доходит до бесконечности выше 120. Я пробовал его без разбора, он дает мне значения, но для окончательного вычисления его не работает .. любая идея о том, как это сделать кроме как избежать разбора ?. – shravan

+0

Вы используете Math.pow, который «только» вычисляет с двойной точностью. Если вы хотите рассчитать с большими числами, вы используете BigDecimal. Вам нужно преобразовать ваш код, чтобы использовать BigDecimals. Например, вы можете использовать 'BigDecimal powedNumber = new BigDecimal (20) .pow (1000);' to pow 20 на 1000. Результат этого вычисления будет слишком большим, чтобы вписаться в double. Вы можете выполнять другие каллуляции с помощью BigDecimal, например, умножать, делить, плюс ... – Rene8888