树莓派提升计划 Android应用科学计算器开发之科学计算

本文探讨了在Android平台上开发科学计算器的过程,主要关注如何处理科学计算,包括预处理数学表达式,处理指数运算,实现sin、cos、tan、ln、lg等科学函数,解决括号内的计算问题,以及计算阶乘和处理E-表达式。通过改进BaseCalculator类,实现了高效准确的科学计算功能。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

这篇研究ScienceCalculator类中基于BaseCalculator类实现的科学计算

首先是对输入的数学表达式进行预处理,包括去掉里面的空格,将e、π替换为数学中的e和π

math = math.replace(" ", "");                               
math = math.replace("π", String.valueOf(Math.PI));         
math = math.replace("e", String.valueOf(Math.exp(1)));     

接下来是对式子中的指数进行运算,将带有指数运算的部分使用pow计算后把原来的式子替换

//(2)计算指数(pow)运算并替换,包括(x)^(y)
        while (math.contains("^")) {

            //1.中间寻找的点
            int midIndex = math.lastIndexOf("^");

            //2.获取左边参数
            double leftNum; //左边的数
            String leftStr; //左边math字符串
            int leftIndex = midIndex - 1;

            if (math.charAt(leftIndex) == ')') {        //1.左边是一个表达式,即左边用括号括起来
                int i = leftIndex - 1;
                while (math.charAt(i) != '(') {
                    i--;
                }
                String subLeftMath = math.substring(i + 1, leftIndex);
                leftNum = baseCalculator.cal(subLeftMath);
                if (leftNum == Double.MAX_VALUE) //每次计算要判断是否出现 math error
                    return Double.MAX_VALUE;

                leftStr = "(" + subLeftMath + ")";
            } else {                                    //2.左边是一个数

                //注意:判定index范围一定要在左边,否则可能出现IndexOutOfRange异常
                while (leftIndex >= 0 && !isOper(math.charAt(leftIndex))) {
                    leftIndex--;
                }
                leftStr = math.substring(leftIndex + 1, midIndex);
                leftNum = Double.parseDouble(leftStr);
            }

            //3.获取右边参数
            double rightNum;
            String rightStr;
            int rightIndex = midIndex + 1;

            if (math.charAt(rightIndex) == '(') {
                int i = rightIndex + 1;
                while (math.charAt(i) != ')') {
                    i++;
                }
                String subRightMath = math.substring(rightIndex + 1, i);
                rightNum = baseCalculator.cal(subRightMath);
                if (rightNum == Double.MAX_VAL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值