Лучшее приближение e с Java

Существует БОЛЬШИЕ набор атрибутов, которые Вы не можете установить в IE с помощью .setAttribute () , который включает каждый встроенный обработчик событий.

Посмотрите здесь для деталей:

http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html

5
задан Sharon 26 September 2009 в 18:06
поделиться

7 ответов

Используйте BigDecimal вместо числа с двойной точностью.

BigDecimal e = BigDecimal.ONE;
BigDecimal fact = BigDecimal.ONE;

for(int i=1;i<100;i++) {
  fact = fact.multiply(new BigDecimal(i));

  e = e.add(BigDecimal.ONE.divide(fact, new MathContext(10000, RoundingMode.HALF_UP)));
}
13
ответ дан 18 December 2019 в 05:55
поделиться

Вы ознакомились с арифметикой произвольной точности в java.util.BigDecimal ?

import java.math.BigDecimal;
import java.math.MathContext;
public class BigExp {
  public static void main(String[] args) {
BigDecimal FIFTY =new BigDecimal("50");
BigDecimal e = BigDecimal.ZERO;
BigDecimal f = BigDecimal.ONE;
MathContext context = new MathContext(1000);

for (BigDecimal i=BigDecimal.ONE; i.compareTo(FIFTY)<0; i=i.add(BigDecimal.ONE)) {
  f = f.multiply(i, context);
  e = e.add(i.divide(f,context),context);

  System.out.println("e = " + e);
}
  }
}
4
ответ дан 18 December 2019 в 05:55
поделиться

Основная проблема заключается в том, что double имеет очень ограниченную точность. Если вам нужна произвольная точность, вам придется использовать BigDecimal . Следующая проблема, с которой вы столкнетесь, - это ограниченный диапазон long , который вы очень быстро превысите с помощью факториала - там вы можете использовать BigInteger .

6
ответ дан 18 December 2019 в 05:55
поделиться

Вы получите лучшие результаты, если посчитаете от 49 до 1, а не от 1 до 49, как сейчас.

3
ответ дан 18 December 2019 в 05:55
поделиться

Пошел с вариацией кода Зеда и мобрула. Отлично работает, спасибо! Кто-нибудь еще посоветует производительность?

public static BigDecimal factorial(int x){
    BigDecimal prod = new BigDecimal("1");
    for(int i = x; i > 1; i--)
        prod = prod.multiply(new BigDecimal(i));
    return prod;
}//fact

public static void main(String[] args) {
    MathContext mc = new MathContext(1000);
    BigDecimal e = new BigDecimal("1", mc);
    for(int i = 1; i < 1000; i++)
        e = e.add(BigDecimal.ONE.divide(factorial(i), mc));
    System.out.print("e = " + e);
}//main 
1
ответ дан 18 December 2019 в 05:55
поделиться

Кто-нибудь еще посоветует производительность?

Да, ваш расчет факториала настолько неэффективен, насколько это возможно. Было бы лучше переместить это внутрь цикла, в котором вы суммируете члены. То, как вы это делаете, превращает проблему O (N) в проблему O (N ^ 2).

И если бы это было реальное вычисление, требующее факториалов, я бы порекомендовал поиск по таблице или неполную гамма-функцию. как правильный способ сделать это.

Единственное, что вы могли бы сделать хуже с точки зрения производительности, - это рекурсивное факториальное вычисление. Тогда у вас возникнет дополнительная проблема с огромным стеком.

1
ответ дан 18 December 2019 в 05:55
поделиться

Чтобы понять, почему вы не можете получить «любую желаемую точность» с помощью double , прочтите эту классическую статью:

Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой

Обратите внимание, что это довольно технический документ. Дополнительные сведения о том, как работают числа с плавающей запятой, см. В этой статье в Википедии: Формат с плавающей запятой двойной точности

0
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: