Существует БОЛЬШИЕ набор атрибутов, которые Вы не можете установить в IE с помощью .setAttribute () , который включает каждый встроенный обработчик событий.
Посмотрите здесь для деталей:
http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html
Используйте 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)));
}
Вы ознакомились с арифметикой произвольной точности в 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);
}
}
}
Основная проблема заключается в том, что double
имеет очень ограниченную точность. Если вам нужна произвольная точность, вам придется использовать BigDecimal
. Следующая проблема, с которой вы столкнетесь, - это ограниченный диапазон long
, который вы очень быстро превысите с помощью факториала - там вы можете использовать BigInteger
.
Вы получите лучшие результаты, если посчитаете от 49 до 1, а не от 1 до 49, как сейчас.
Пошел с вариацией кода Зеда и мобрула. Отлично работает, спасибо! Кто-нибудь еще посоветует производительность?
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
Кто-нибудь еще посоветует производительность?
Да, ваш расчет факториала настолько неэффективен, насколько это возможно. Было бы лучше переместить это внутрь цикла, в котором вы суммируете члены. То, как вы это делаете, превращает проблему O (N) в проблему O (N ^ 2).
И если бы это было реальное вычисление, требующее факториалов, я бы порекомендовал поиск по таблице или неполную гамма-функцию. как правильный способ сделать это.
Единственное, что вы могли бы сделать хуже с точки зрения производительности, - это рекурсивное факториальное вычисление. Тогда у вас возникнет дополнительная проблема с огромным стеком.
Чтобы понять, почему вы не можете получить «любую желаемую точность» с помощью double
, прочтите эту классическую статью:
Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой
Обратите внимание, что это довольно технический документ. Дополнительные сведения о том, как работают числа с плавающей запятой, см. В этой статье в Википедии: Формат с плавающей запятой двойной точности