日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用Java实现的高精度科学计算器

發(fā)布時間:2023/12/20 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Java实现的高精度科学计算器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

高精度科學計算器

混合運算展示:

精度展示:

簡介:

可以進行混合運算,混合運算包括加法+,減法-,乘法*,除法/,取余%,左括號(,右括號),根號√,對數(shù)log,指數(shù)^。

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

? 輸出:47.27807190511263678372

理論可以達到無限精度,過高的精度會增加計算時間,需要提前設(shè)置精度,即小數(shù)點后多少位,默認為32位。

按鍵功能及使用方法:
按鍵功能使用方法
CE清空點擊該鍵清空輸入輸出
清除點擊該鍵清除最后一位輸入
Exp指數(shù)表示正在更新。。。
+/-符號切換正在更新。。。
+加法可用于混合運算,輸入“被加數(shù)”,“+”,“加數(shù)”后點擊“=”計算結(jié)果
-減法同加法
*乘法同加法
/除法同加法
Mod取余同加法,按鍵顯示為“Mod”,運算符為”%“
(左括號用于混合運算,限制優(yōu)先級
)右括號用于混合運算,限制優(yōu)先級
Rad/Deg規(guī)定三角函數(shù)計算時的單位按鍵顯示Rad代表使用弧度單位,按鍵顯示Deg代表使用角度單位
2nd切換按鍵的第二功能點擊該按鍵,三角函數(shù)切換為反三角函數(shù),指數(shù)和對數(shù)功能按鍵也會進行轉(zhuǎn)換
sin計算正弦函數(shù)根據(jù)Rad/Deg按鍵輸入對應單位的參數(shù),點擊該鍵直接計算結(jié)果
cos計算余弦函數(shù)根據(jù)Rad/Deg按鍵輸入對應單位的參數(shù),點擊該鍵直接計算結(jié)果
tan計算正切函數(shù)根據(jù)Rad/Deg按鍵輸入對應單位的參數(shù),點擊該鍵直接計算結(jié)果
asin計算反正弦函數(shù)輸入?yún)?shù),點擊該鍵根據(jù)Rad/Deg按鍵計算對應單位的結(jié)果
acos計算反余弦函數(shù)輸入?yún)?shù),點擊該鍵根據(jù)Rad/Deg按鍵計算對應單位的結(jié)果
atan計算反正切函數(shù)輸入?yún)?shù),點擊該鍵根據(jù)Rad/Deg按鍵計算對應單位的結(jié)果
2√x平方根輸入?yún)?shù),點擊該按鍵直接計算結(jié)果
3√x立方根輸入?yún)?shù),點擊該按鍵直接計算結(jié)果
x^2平方輸入?yún)?shù),點擊該按鍵直接計算結(jié)果
x^3立方輸入?yún)?shù),點擊該按鍵直接計算結(jié)果
x^nn次方先輸入x,點擊該鍵,再輸入n,點擊“=”計算結(jié)果,可用于混合運算。
n√xn次根下x先輸入n,點擊該鍵,再輸入x,點擊“=”計算結(jié)果,可用于混合運算。
log計算以10為底的對數(shù)輸入?yún)?shù),點擊該按鍵直接計算結(jié)果。
ylogx以x為底y的對數(shù)先輸入y,點擊該鍵,再輸入x,點擊“=”計算結(jié)果,可用于混合運算。
ln計算以e為底的對數(shù)輸入?yún)?shù),點擊該按鍵直接計算結(jié)果。
e^xe的x次方輸入?yún)?shù),點擊該按鍵直接計算結(jié)果。
π圓周率點擊該鍵顯示圓周率π的數(shù)值,該數(shù)值精度與設(shè)置精度有關(guān)。
e自然常數(shù)e點擊該鍵顯示自然常數(shù)e的數(shù)值,該數(shù)值精度與設(shè)置精度有關(guān)。
1/x倒數(shù)輸入?yún)?shù),點擊該鍵直接計算結(jié)果。
運算結(jié)果精度說明:

程序中使用Java的BigDecimal類實現(xiàn)高精度,BigDecimal類中自帶加法add()、減法subtract()、乘法multiply()、除法**divide()及整數(shù)次方pow()**函數(shù)。

在上述函數(shù)基礎(chǔ)上自己實現(xiàn)對數(shù)函數(shù)log()、指數(shù)函數(shù)pow()、三角函數(shù)sin()cos()tan()arcsin()arccos()arctan()、**arccot()**函數(shù),同樣可以達到無限精度。

步驟:

  • 首先實現(xiàn)階乘函數(shù)

    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)

    在循環(huán)中不斷累加,如果當前項的值小于設(shè)定精度,默認小于10^-32時退出。

    但該展開式只有在x接近1時收斂比較快,如果計算ln(10)經(jīng)測試大概耗時3s,完全不能忍。

    接下來通過放縮區(qū)間加快速度,已知ln(xy)=ln(x)+ln(y),找一個折中的辦法,先將參數(shù)x 10倍放縮到[0.5, 5]區(qū)間,標記縮放次數(shù)為ln10Count,再將參數(shù)x 1.1倍縮放到[0.95, 1.05]區(qū)間得到x’,標記縮放次數(shù)為ln1_1Count,最終結(jié)果為ln10Count*ln(10) + ln1_1Count*ln(1.1) + ln(x’),該方法需要提前計算ln(10)與ln(1.1),但計算一次可以永久使用,對于ln(10)轉(zhuǎn)化為10*ln(1.25) + ln(1.073741824)進一步加快速度。

  • y log x即以x為底y的對數(shù)可轉(zhuǎn)換為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?+?
    其中需要前面實現(xiàn)的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]區(qū)間的sin(x)的值,需要先將參數(shù)轉(zhuǎn)換到此區(qū)間

  • 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定義域為實數(shù)集,但|x|在接近1或大于1的時候收斂速度特別慢

    解決辦法:

  • 使用arctan(-x) = -arctan(x),將參數(shù)限制到正實數(shù)
  • 如果x>1,根據(jù)arctan(x)=PI/2-arctan(1/x),求arctan(1/x),將參數(shù)轉(zhuǎn)換到[0, 1]區(qū)間
  • 但x在接近1時(如0.99)收斂仍然很慢,接下來將參數(shù)x限制到[0, 0.5]區(qū)間
  • 如果x>0.5,根據(jù)arctan(x)=arctan(y)+arctan((x-y)/(1+xy)),將arctan的參數(shù)限制到0.5以下,此處可以選更小的值達到更快的速度
  • arccot(x) = PI/2 - arctan(x)

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

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

混合運算實現(xiàn)流程:
  • 使用正則表達式提取輸入算式的參數(shù)和運算符

    用于匹配的正則表達式:

  • 將中綴表達式轉(zhuǎn)為后綴表達式

  • 對后綴表達式進行計算

更新日志:
  • 2020.12.8 20.18

    三角函數(shù)仍使用double進行計算,精確到小數(shù)點后(16-整數(shù)位數(shù))位(如計算atan(80°)=89.28384005452959,即小數(shù)位數(shù)為16-2位整數(shù)位=14位小數(shù)位),相當于對double變量表示不了的精度取了個近似值,計算結(jié)果不會再出現(xiàn)sin(30°) =0.49999999999999994這種情況。

  • 2020.12.10 16.12

    正則表達式進行了優(yōu)化,加入正后顧可以正確匹配負數(shù)和減法,比如對于“2-3”匹配結(jié)果應該為(“2”,“-”,“3”),對于“-2–3”匹配結(jié)果應該為(“-2”,“-”,“-3”)。

  • 2020.12.10 16.12

    對數(shù)函數(shù)仍使用double進行計算,使用與三角函數(shù)相同的方法解決精度問題。

  • 2020.12.11 10.46

    結(jié)果使用DecimalFormat.format()格式化字符串,三位一體使用“,”分開顯示,但輸入?yún)?shù)還沒有實現(xiàn),如果要實現(xiàn)的話必須要跟win10計算器一樣當參數(shù)輸入完畢,輸入運算符時參數(shù)才上移。

  • 2020.12.14 19.07

    使用BigDecimal實現(xiàn)常用數(shù)學函數(shù),可以達到無限精度

    輸出結(jié)果三位一體分隔開,便于閱讀,輸入暫未實現(xiàn)

待優(yōu)化功能:
  • 將輸入?yún)?shù)和計算結(jié)果三位一體使用“,”分隔開,便于閱讀,可以使用DecimalFormat.format()函數(shù)。
  • 三角函數(shù)應該有角度制、弧度制、百分度制(梯度制),暫未實現(xiàn)百分度制。
  • 使用BigDecimal實現(xiàn)對數(shù)函數(shù)及指數(shù)函數(shù)求解(log,ln,√,^),這樣可以達到任意精度,不再局限于double的精度。
  • 計算前檢查算式的合法性,直接用規(guī)則檢查比較復雜,可以在混合運算解析的過程中使用try和catch捕獲異常,對其他非混合運算算式可直接檢查。比如檢查反三角函數(shù)的輸入?yún)?shù)范圍可以直接用規(guī)則檢查,檢查階乘的參數(shù)是不是整數(shù)二者都可以。

現(xiàn)對數(shù)函數(shù)及指數(shù)函數(shù)求解(log,ln,√,^),這樣可以達到任意精度,不再局限于double的精度。~~

  • 計算前檢查算式的合法性,直接用規(guī)則檢查比較復雜,可以在混合運算解析的過程中使用try和catch捕獲異常,對其他非混合運算算式可直接檢查。比如檢查反三角函數(shù)的輸入?yún)?shù)范圍可以直接用規(guī)則檢查,檢查階乘的參數(shù)是不是整數(shù)二者都可以。

這個計算器也是匆匆趕時間完成的,再加上不可能考慮到所有輸入情況,沒有對錯誤的輸入進行提示,其中肯定存在不少問題,項目地址在下面,其中包括4個java文件,CalculatorHMI實現(xiàn)計算器的圖形界面及按鍵的事件處理,修改其中的accuracy變量可以改變精度,也就是結(jié)果精確到小數(shù)點后多少位,默認為32位,更高的位數(shù)也可以,但計算時間也會加長。BigDecimalMath就是用泰勒公式重寫的Math庫中的函數(shù),MixedOperation實現(xiàn)混合運算,Main文件中就是主函數(shù),是整個工程的入口。當然電腦上必須有jre也就是java運行環(huán)境才可以運行。

項目視頻
github地址

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

總結(jié)

以上是生活随笔為你收集整理的使用Java实现的高精度科学计算器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。