【JavaBigDecimal练习】利用BigDecimal精确计算欧拉数

该博客介绍了如何利用泰勒展开式计算欧拉数e的小数点后1000位,通过Java的BigDecimal类实现高精度计算。示例中展示了计算10000、20000和30000位的情况,并提供了大数阶乘的辅助方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用BigDecimal精确计算欧拉数小数点后面1000位

相信大家对于泰勒展开已经稔熟于心,接下来我们就利用下列的泰勒展开: ex=1+11!x+12!x2+13!x3+.......+1n!xn \qquad e^x = 1+\frac{1}{1!}x+\frac{1}{2!}x^2+\frac{1}{3!}x^3+.......+\frac{1}{n!}x^n ex=1+1!1x+2!1x2+3!1x3+.......+n!1xn
当展开式满足下列条件时:x=1 \qquad x =1x=1

可推出如下结论:
e1=10!+11!+12!+..........+1(n−1)!+1n! \qquad e^1 = \frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+..........+\frac{1}{(n-1)!}+\frac{1}{n!} e1=0!1+1!1+2!1+..........+(n1)!1+n!1

用代码进行实现

// An highlighted block
package Exe5;

import java.math.BigDecimal;

public class Demo {

    /** main-method */

    public static void main(String[] args) {
        int num1 = 10000;
        BigDecimal temp1 = new BigDecimal(num1);
        System.out.println(valueOfEuler(temp1));
        System.out.println("===============================");
        int num2 = 20000;
        BigDecimal temp2 = new BigDecimal(num2);
        System.out.println(valueOfEuler(temp2));
        System.out.println("===============================");
        int num3 = 30000;
        BigDecimal temp3 = new BigDecimal(num3);
        System.out.println(valueOfEuler(temp3));
    }
    /**
     * approximately value of nature Euler scale
     *
     * @param num
     * @return value of Euler
     */
    public static BigDecimal valueOfEuler(BigDecimal num) {
        //初始化自然对数也就是欧拉数
        double euler = 0;
        //初始化赋值1 用来和num比较以便控制累加次数
        double temp = -1;
        //temp2作用为提供 num个1来累加
        double temp2 = 1;
        //将double型欧拉数字转化为BigDecimal
        //将temp也转化为BigDecimal
        //将temp2也转化为BigDecimal
        BigDecimal newEuler = new BigDecimal(euler);
        BigDecimal newTemp = new BigDecimal(temp);
        BigDecimal newTemp2 = new BigDecimal(temp2);
        //运用compareTo()方法控制累加次数
        do {
            // newTemp++
            newTemp = newTemp.add(newTemp2);
            // e = 1/0!+ 1/1!+1/2!+......+1/num!
            newEuler = newEuler.add(newTemp2.divide(ComputeFactorial(newTemp), 1000, BigDecimal.ROUND_UP));
            //直到newTemp自己加到与num相等后
        } while (newTemp.compareTo(num) == -1);
        //返回欧拉数
        return newEuler;
    }

    /**
     * 大数阶乘方法
     */
    public static BigDecimal ComputeFactorial(BigDecimal num) {
        //初始变量 值为1
        int s = 1;
        //改变数据类型
        BigDecimal begin = new BigDecimal(s);
        //如果导入的参数num > begin,则返回1
        if (num.compareTo(begin) == 1) {
            //结果result = num*(num-1)
            BigDecimal result = num.multiply(num.subtract(begin));
            //返回结果 result = num * (num - 1) * (num - 2) * (num -3) .....* 1 两两一组以此递归
            return result.multiply(ComputeFactorial(num.subtract(begin.add(begin))));
        }
        //如果相等过后返回begin begin的值为1
        else {
            return begin;
        }
    }
}

输出语句

由于计算量很大目前只展示

int num = 10000;
BigDecimal newNum = new BigDecimal(num);
System.out.println(ValueOfEuler(newNum));

结果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值