高精度科学计算器

混合运算展示:

精度展示:

简介:

可以进行混合运算,混合运算包括加法+,减法-,乘法*,除法/,取余%,左括号(,右括号),根号√,对数log,指数^。

如:输入:(3+2)^2+108/5-10log2+3√64

​ 输出:47.27807190511263678372

理论可以达到无限精度,过高的精度会增加计算时间,需要提前设置精度,即小数点后多少位,默认为32位。

按键功能及使用方法:
按键 功能 使用方法
CE 清空 点击该键清空输入输出
清除 点击该键清除最后一位输入
Exp 指数表示 正在更新。。。
+/- 符号切换 正在更新。。。
+ 加法 可用于混合运算,输入“被加数”,“+”,“加数”后点击“=”计算结果
- 减法 同加法
* 乘法 同加法
/ 除法 同加法
Mod 取余 同加法,按键显示为“Mod”,运算符为”%“
( 左括号 用于混合运算,限制优先级
) 右括号 用于混合运算,限制优先级
Rad/Deg 规定三角函数计算时的单位 按键显示Rad代表使用弧度单位,按键显示Deg代表使用角度单位
2nd 切换按键的第二功能 点击该按键,三角函数切换为反三角函数,指数和对数功能按键也会进行转换
sin 计算正弦函数 根据Rad/Deg按键输入对应单位的参数,点击该键直接计算结果
cos 计算余弦函数 根据Rad/Deg按键输入对应单位的参数,点击该键直接计算结果
tan 计算正切函数 根据Rad/Deg按键输入对应单位的参数,点击该键直接计算结果
asin 计算反正弦函数 输入参数,点击该键根据Rad/Deg按键计算对应单位的结果
acos 计算反余弦函数 输入参数,点击该键根据Rad/Deg按键计算对应单位的结果
atan 计算反正切函数 输入参数,点击该键根据Rad/Deg按键计算对应单位的结果
2√x 平方根 输入参数,点击该按键直接计算结果
3√x 立方根 输入参数,点击该按键直接计算结果
x^2 平方 输入参数,点击该按键直接计算结果
x^3 立方 输入参数,点击该按键直接计算结果
x^n n次方 先输入x,点击该键,再输入n,点击“=”计算结果,可用于混合运算。
n√x n次根下x 先输入n,点击该键,再输入x,点击“=”计算结果,可用于混合运算。
log 计算以10为底的对数 输入参数,点击该按键直接计算结果。
ylogx 以x为底y的对数 先输入y,点击该键,再输入x,点击“=”计算结果,可用于混合运算。
ln 计算以e为底的对数 输入参数,点击该按键直接计算结果。
e^x e的x次方 输入参数,点击该按键直接计算结果。
π 圆周率 点击该键显示圆周率π的数值,该数值精度与设置精度有关。
e 自然常数e 点击该键显示自然常数e的数值,该数值精度与设置精度有关。
1/x 倒数 输入参数,点击该键直接计算结果。
运算结果精度说明:

程序中使用Java的BigDecimal类实现高精度,BigDecimal类中自带加法add()、减法subtract()、乘法multiply()、除法**divide()及整数次方pow()**函数。

在上述函数基础上自己实现对数函数log()、指数函数pow()、三角函数sin()cos()tan()arcsin()arccos()arctan()、**arccot()**函数,同样可以达到无限精度。

步骤:

  • 首先实现阶乘函数

    public BigDecimal fac(int n)
    
  • ln(x)的泰勒展开为:
    ln⁡(x)=ln⁡(1+y1−y)=2y(11+13y2+15y4+17y6+19y8+⋯)\ln (x)=\ln \left(\frac{1+y}{1-y}\right) \quad=2 y\left(\frac{1}{1}+\frac{1}{3} y^{2}+\frac{1}{5} y^{4}+\frac{1}{7} y^{6}+\frac{1}{9} y^{8}+\cdots\right) ln(x)=ln(1−y1+y​)=2y(11​+31​y2+51​y4+71​y6+91​y8+⋯)
    其中y = (x - 1) / (x + 1)

    在循环中不断累加,如果当前项的值小于设定精度,默认小于10^-32时退出。

    但该展开式只有在x接近1时收敛比较快,如果计算ln(10)经测试大概耗时3s,完全不能忍。

    接下来通过放缩区间加快速度,已知ln(xy)=ln(x)+ln(y),找一个折中的办法,先将参数x 10倍放缩到[0.5, 5]区间,标记缩放次数为ln10Count,再将参数x 1.1倍缩放到[0.95, 1.05]区间得到x’,标记缩放次数为ln1_1Count,最终结果为ln10Count*ln(10) + ln1_1Count*ln(1.1) + ln(x’),该方法需要提前计算ln(10)与ln(1.1),但计算一次可以永久使用,对于ln(10)转化为10*ln(1.25) + ln(1.073741824)进一步加快速度。

  • y log x即以x为底y的对数可转换为log(y)/log(x)

  • a^x的泰勒展开式为:
    ax=exln⁡a=1+xln⁡a1!+(xln⁡a)22!+(xln⁡a)33!+⋯a^{x}=e^{x \ln a}=1+\frac{x \ln a}{1 !}+\frac{(x \ln a)^{2}}{2 !}+\frac{(x \ln a)^{3}}{3 !}+\cdots ax=exlna=1+1!xlna​+2!(xlna)2​+3!(xlna)3​+⋯
    其中需要前面实现的ln(x)

  • sin(x)的泰勒展开式为:
    sin⁡x=∑n=0∞(−1)n(2n+1)!x2n+1=x−13!x3+15!x5−⋯+(−1)n(2n+1)!x2n+1+⋯\sin x=\sum_{n=0}^{\infty} \frac{(-1)^{n}}{(2 n+1) !} x^{2 n+1}=x-\frac{1}{3 !} x^{3}+\frac{1}{5 !} x^{5}-\cdots+\frac{(-1)^{n}}{(2 n+1) !} x^{2 n+1}+\cdots sinx=n=0∑∞​(2n+1)!(−1)n​x2n+1=x−3!1​x3+5!1​x5−⋯+(2n+1)!(−1)n​x2n+1+⋯
    该展开式只能计算[0, PI/2]区间的sin(x)的值,需要先将参数转换到此区间

  • cos(x)同理

  • tan(x) = sin(x)/cos(x)

  • arctan(x)的泰勒展开式为:
    arctan⁡x=∑n=0∞(−1)n2n+1x2n+1=x−13x3+15x5+⋯+(−1)n2n+1x2n+1+⋯\arctan x=\sum_{n=0}^{\infty} \frac{(-1)^{n}}{2 n+1} x^{2 n+1}=x-\frac{1}{3} x^{3}+\frac{1}{5} x^{5}+\cdots+\frac{(-1)^{n}}{2 n+1} x^{2 n+1}+\cdots arctanx=n=0∑∞​2n+1(−1)n​x2n+1=x−31​x3+51​x5+⋯+2n+1(−1)n​x2n+1+⋯
    x定义域为实数集,但|x|在接近1或大于1的时候收敛速度特别慢

    解决办法:

    1. 使用arctan(-x) = -arctan(x),将参数限制到正实数
    2. 如果x>1,根据arctan(x)=PI/2-arctan(1/x),求arctan(1/x),将参数转换到[0, 1]区间
    3. 但x在接近1时(如0.99)收敛仍然很慢,接下来将参数x限制到[0, 0.5]区间
    4. 如果x>0.5,根据arctan(x)=arctan(y)+arctan((x-y)/(1+xy)),将arctan的参数限制到0.5以下,此处可以选更小的值达到更快的速度
  • arccot(x) = PI/2 - arctan(x)

  • arcsin(x) = arctan(x/sqrt(1-x^2))

  • arccos(x) = PI/2 - arcsin(x)

混合运算实现流程:
  • 使用正则表达式提取输入算式的参数和运算符

    用于匹配的正则表达式:

  • 将中缀表达式转为后缀表达式

  • 对后缀表达式进行计算

更新日志:
  • 2020.12.8 20.18

    三角函数仍使用double进行计算,精确到小数点后(16-整数位数)位(如计算atan(80°)=89.28384005452959,即小数位数为16-2位整数位=14位小数位),相当于对double变量表示不了的精度取了个近似值,计算结果不会再出现sin(30°) =0.49999999999999994这种情况。

  • 2020.12.10 16.12

    正则表达式进行了优化,加入正后顾可以正确匹配负数和减法,比如对于“2-3”匹配结果应该为(“2”,“-”,“3”),对于“-2–3”匹配结果应该为(“-2”,“-”,“-3”)。

  • 2020.12.10 16.12

    对数函数仍使用double进行计算,使用与三角函数相同的方法解决精度问题。

  • 2020.12.11 10.46

    结果使用DecimalFormat.format()格式化字符串,三位一体使用“,”分开显示,但输入参数还没有实现,如果要实现的话必须要跟win10计算器一样当参数输入完毕,输入运算符时参数才上移。

  • 2020.12.14 19.07

    使用BigDecimal实现常用数学函数,可以达到无限精度

    输出结果三位一体分隔开,便于阅读,输入暂未实现

待优化功能:
  • 将输入参数和计算结果三位一体使用“,”分隔开,便于阅读,可以使用DecimalFormat.format()函数。
  • 三角函数应该有角度制、弧度制、百分度制(梯度制),暂未实现百分度制。
  • 使用BigDecimal实现对数函数及指数函数求解(log,ln,√,^),这样可以达到任意精度,不再局限于double的精度。
  • 计算前检查算式的合法性,直接用规则检查比较复杂,可以在混合运算解析的过程中使用try和catch捕获异常,对其他非混合运算算式可直接检查。比如检查反三角函数的输入参数范围可以直接用规则检查,检查阶乘的参数是不是整数二者都可以。

现对数函数及指数函数求解(log,ln,√,^),这样可以达到任意精度,不再局限于double的精度。~~

  • 计算前检查算式的合法性,直接用规则检查比较复杂,可以在混合运算解析的过程中使用try和catch捕获异常,对其他非混合运算算式可直接检查。比如检查反三角函数的输入参数范围可以直接用规则检查,检查阶乘的参数是不是整数二者都可以。

这个计算器也是匆匆赶时间完成的,再加上不可能考虑到所有输入情况,没有对错误的输入进行提示,其中肯定存在不少问题,项目地址在下面,其中包括4个java文件,CalculatorHMI实现计算器的图形界面及按键的事件处理,修改其中的accuracy变量可以改变精度,也就是结果精确到小数点后多少位,默认为32位,更高的位数也可以,但计算时间也会加长。BigDecimalMath就是用泰勒公式重写的Math库中的函数,MixedOperation实现混合运算,Main文件中就是主函数,是整个工程的入口。当然电脑上必须有jre也就是java运行环境才可以运行。

项目视频
github地址

------故里草木深------

使用Java实现的高精度科学计算器相关推荐

  1. java实现多功能科学计算器(包括进制转换,三角函数,四则运算等)

    多功能科学计算器(包括进制转换,三角函数,四则运算等) Basic Framework calculator.java package myCalculator; import java.awt.*; ...

  2. 计算机课设:基于Java实现的简单科学计算器

    设计目的 对Java课程知识的总结,进一步提高对Java语言的理解与掌握 深入的理解Java语言,并将其中抽象概念运用到实际编程中,锻炼学生的课题分析和解决问题的能力,培养正确的编程习惯 培养自主学习 ...

  3. linux科学计算器_2个适用于Linux桌面的科学计算器

    linux科学计算器 每个Linux桌面环境至少都带有一个简单的桌面计算器,但是其中大多数简单的计算器就是这样:一个用于简单计算的简单工具. 幸运的是,也有例外. 这些程序不仅具有平方根和几个三角函数 ...

  4. 手写计算器java_可编程科学计算器app

    可编程科学计算器app是一款功能超级强大的科学计算器,它通过自建程序解决很多工程测算的问题!欢迎有需要的朋友在芒果下载站下载体验! 可编程科学计算器app官方介绍 程序开发科学计算器是一个和Matla ...

  5. 可编程计算机边长计算器,可编程科学计算器(Scientific Calculator Plus)

    Scientific Calculator Plus这款手机可编程计算器ui做的不怎么好看,不过胜在功能强大,它是一个和Matlab相似的强大的数学分析工具.除了其他大部分计算器所拥有的基本功能. 功 ...

  6. linux服务器客户端计算器,分享|两款 Linux 桌面端可用的科学计算器

    如果你想找个高级的桌面计算器的话,你可以看看开源软件,以及一些其它有趣的工具. 每个 Linux 桌面环境都至少带有一个功能简单的桌面计算器,但大多数计算器只能进行一些简单的计算. 幸运的是,还是有例 ...

  7. java 线性计算器_java版科学计算器,支持表达式计算

    <java版科学计算器,支持表达式计算>由会员分享,可在线阅读,更多相关<java版科学计算器,支持表达式计算(12页珍藏版)>请在人人文库网上搜索. 1.程序设计综合设计题目 ...

  8. java高级计算器_GitHub - yetshrimp/Java-caculator: 多功能科学计算器

    类windows的java计算器 使用java图形化开发实现了科学计算器的大部分功能,java课普通大作业难度. 1.本计算器仿照windows计算器的外观及科学计算器.标准计算器面板功能而实现. 2 ...

  9. java计算器项目总结_团队-科学计算器-项目总结

    一,目的 我们日常生活的开支,大额数字或者多倍小数的计算都需要计算器的帮助,处理数字的开方.正余弦都离不开计算器.虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格昂贵,操 ...

  10. 高精度计算器_尝试设计个.NET Core高精度科学计算库

    猪年快到了,还记得在我在鸡年立了个flag,计划在狗年推出<纸书科学计算器>的2.0版本(HowardZ:近来的一些修修补补).然而现实很骨感,我因为时间太紧而咕咕了--就此陷入了人类三大 ...

最新文章

  1. unix环境汇编语言常用工具
  2. P1284 三角形牧场
  3. 编程软件python t-Python 3.7 64位下载
  4. hdu4122 制作月饼完成订单的最小花费
  5. fuzzy k means
  6. Spring Security——login显示[Bad credentials]
  7. oracle中check约束性别,关于Oracle Check类型约束的导入与启用
  8. git push被拒绝_规范git项目提交并自动生成项目commit log
  9. prim算法和kruskal算法(C语言)
  10. ajax modelbinder,.NET Core 使用ModelBinder去掉所有参数的空格
  11. 地理必修一三大类岩石_高中地理 | 必备基础知识点干货
  12. java 类 赋值_java类怎样赋值
  13. Java基础篇之什么是CharArrayWriter
  14. js获取内网ip_WebRTC安全问题:私有IP与mDNS
  15. python判断邮箱格式是否正确_如何判断用户输入的邮箱格式是否正确?
  16. Win8右键反应慢的原因与解决办法
  17. charles 抓包图片显示_抓包修改工具(Charles)
  18. solr的copyFeild用法(改变各个feild的权重,修改打分结果)-注意!
  19. 电脑开机黑屏错误代码U盘重装系统教学
  20. 陷阱技术探秘 ──动态汉化Windows技术的分析

热门文章

  1. 墨子科技成果是计算机,近年来取得了哪些科技成就_现代史_我爱历史网
  2. android 计步器acc,利用腾讯云云函数执行部署修改小米运动步数代码_每天自动修改步数...
  3. 雷军:《我十年的程序员生涯》系列之三:阳光灿烂的日子
  4. 合工大OJ 1359
  5. 计算机专业申请美本容易吗,美国纽约大学计算机科学专业申请难度大吗?看完录取要求就明白了...
  6. 在线招聘风起,周伯通怎么玩社区招聘?
  7. 世界性能服务器图片,王思聪花了一百万组装了台服务器:全球跑分第四 64核心128线程!快来围观~...
  8. 健身的好方法-----软件开发人员
  9. 2008 r2 server sql 中文版补丁_Microsoft SQL Server 2008 r2 sp2补丁 64位 官方免费版
  10. c语言文字表达式,【原创】化学方程式配平算法的设计与实现( 非Naylon版)