math-engine v2.0,數學表達式解析計算引擎

2021-01-21 開源中國
更新日誌: 增加 常量 pi 增加 三角函數支持 sin(), cos(), tan(), cot(), sec(), csc() 增加 三角函數參數調整,可選 弧度RadianMode、角度AngleMode 增加 輔助函數 abs(), ceil(), floor(), round(), sqrt(). cbrt() 增加 godoc.org 支持 增加 頂級函數 ParseAndExec 增加 單元測試 修復 解析錯誤 e.g. (((Math-Engine

使用 Go 實現的數學表達式解析計算引擎,無任何依賴,相對比較完整的完成了數學表達式解析執行,包括詞法分析、語法分析、構建AST、運行。

能夠處理的表達式樣例:

1+127-21+(3-4)*6/2.5 (88+(1+8)*6)/2+99 123_345_456 * 1.5 - 2 ^ 4 -4 * 6 + 2e2 - 1.6e-3 sin(pi/2)+cos(45-45*1)+tan(pi/4) 99+abs(-1)-ceil(88.8)+floor(88.8)Demo

Method Support symbol explanation e.g. + 加,plus 1+2 = 3 - 減,sub 8-3.5 = 4.5 * 乘,multiply 2*3 = 6 / 除,division 5/2 = 2.5 % 取餘,remainder 5%2 = 1 ^ 整數次方,integer power 2^3 = 8, 3^2 = 9 e 科學計數法,E-notation 1.2e3 = 1200,1.2e-2 = 0.012 () 括號,brackets (2+3)*4 = 20 _ 數字分隔符,number separator 123_456_789 = 123456789 pi π pi = 3.141592653589793 sin(x) 正弦函數,sine sin(pi/2) = 1 cos(x) 餘弦函數,cosine cos(0) = 1 tan(x) 正切函數,tangent tan(pi/4) = 1 cot(x) 餘切函數,cotangent cot(pi/4) = 1 sec(x) 正割函數,secant sec(0) = 1 csc(x) 餘割函數,cosecant csc(pi/2) = 1 abs(x) 絕對值,absolute value abs(-6) = 6 ceil(x) 向上取整 ceil(4.2) = 5 floor(x) 向下取整 floor(4.8) = 4 round(x) 四捨五入取整 round(4.4) = 4, round(4.5) = 5 sqrt(x) 平方根,square root sqrt(4) = 2 cbrt(x) 立方根,cube root cbrt(27) = 3 Usage

你可以直接引用該庫嵌入到自己的程序中:

go get -u github.com/dengsgo/math-engine

在代碼中引入:

import "github.com/dengsgo/math-engine/engine"

e.g. 1 直接調用解析執行函數 :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + 2 * 6 / 4 + (456 - 8 * 9.2) - (2 + 4 ^ 5)" // call top level function r, err := engine.ParseAndExec(s) if err != nil { fmt.Println(err) } fmt.Printf("%s = %v", s, r)}

e.g. 2 依次調用函數,手動執行 :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + 2 * 6 / 4 + (456 - 8 * 9.2) - (2 + 4 ^ 5)" exec(s)}// call engine// one by onefunc exec(exp string) { // input text -> []token toks, err := engine.Parse(exp) if err != nil { fmt.Println("ERROR: " + err.Error()) return } // []token -> AST Tree ast := engine.NewAST(toks, exp) if ast.Err != nil { fmt.Println("ERROR: " + ast.Err.Error()) return } // AST builder ar := ast.ParseExpression() if ast.Err != nil { fmt.Println("ERROR: " + ast.Err.Error()) return } fmt.Printf("ExprAST: %+v\n", ar) // AST traversal -> result r := engine.ExprASTResult(ar) fmt.Println("progressing ...\t", r) fmt.Printf("%s = %v\n", exp, r)}

編譯運行,應該可以看到如下輸出:

ExprAST: {Op:- Lhs:{Op:+ Lhs:{Op:+ Lhs:{Val:1} Rhs:{Op:/ Lhs:{Op:* Lhs:{Val:2} Rhs:{Val:6}} Rhs:{Val:4}}} Rhs:{Op:- Lhs:{Val:456} Rhs:{Op:* Lhs:{Val:8} Rhs:{Val:9.2}}}} Rhs:{Op:+ Lhs:{Val:2} Rhs:{Op:^ Lhs:{Val:4} Rhs:{Val:5}}}}progressing ... -639.61+2*6/4+(456-8*9.2)-(2+4^5) = -639.6

TrigonometricMode

三角函數的參數類型默認為弧度RadianMode,e.g. sin(pi/2) = 1.

你可以通過設置 TrigonometricMode 調整參數類型,可選 弧度RadianMode、角度AngleMode,e.g. :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + sin(90)" engine.TrigonometricMode = engine.AngleMode engine.ParseAndExec(s) // will return 2, nil s = "1 + sin(pi/2)" engine.TrigonometricMode = engine.RadianMode engine.ParseAndExec(s) // will return 2, nil}

Document

godoc.org/github.com/dengsgo/math-engine/engine

Compile

go version 1.12

# Compile Demogo testgo build./math-engine

也可以直接下載已編譯好的二進位文件,直接運行:

Github Releases

實現細節

請閱讀我的博客文章:用 Go 實現一個完整的數學表達式計算引擎

TODO已實現  加 +  減 -  乘 *  除 /  取餘 %  整數次方 ^  科學計數法 e.g. 1.2e7、 1.2e-7  括號 ()  混合運算 e.g. 1+2*6/4+(456-8*9.2)-(2+4^5)*2e3+1.2e-2  友好的長數字 e.g. 123_456_789  三角函數 e.g. sin, cos, tan, cot, sec, csc  常量 pi  輔助函數 e.g. abs, ceil, floor, sqrt, cbrt  友好的錯誤消息 e.g.

input /> 123+89-0.0.9ERROR: strconv.ParseFloat: parsing "0.0.9": invalid syntaxwant '(' or '0-9' but get '0.0.9'--123+89-0.0.9 ^--

待實現

相關焦點

  • xk-time 2.2.0 發布,Java 時間工具包,支持解析自然語言時間,明天...
    2.支持解析自然語言時間,今天,明天,下周,下月,明年,昨天,上周,上月,去年等,支持自定義解析自然語言時間。3.日期計算工具類優化,提高性能。4.完善注釋文檔,生成javadoc的API在線文檔: https://apidoc.gitee.com/xkzhangsan/xk-time/ 。5.代碼優化。
  • 更快、更強的Python實現:Pyston v2.0發布
    選自THE PYSTON BLOG作者:Kevin Modzelewski機器之心編譯機器之心編輯部比 Python 快 20% 的 Pyston v2.0 來了。Pyston 解析 Python 代碼,並轉換到 LLVM 中間表示(IR),然後 IR 通過 LLVM 優化器和 LLVM JIT 引擎,得到可執行的機器碼。六年過去,10 月 28 日 Pyston 團隊發布了最新版本——Pyston v2。
  • Java 時間工具包 xk-time 3.0.1 發布,中國工作日計算問題修復
    > 軟體介紹:xk-time 是時間轉換,時間計算,時間格式化,時間解析,日曆,時間cron表達式和時間NLP等的工具,使用Java8,線程安全,簡單易用,多達70幾種常用日期格式化模板,支持Java8時間類和Date,輕量級,無第三方依賴。
  • 數學與圓周運動的結合
    (多選)如圖所示,長L=0.5 m的輕質細杆,一端固定有一個質量為m=3 kg的小球,另一端由電動機帶動,使杆繞O點在豎直平面內做勻速圓周運動,小球的速率為v=2 m/s.取g=10 m/s2,下列說法正確的是(     )
  • 刨根究底正則表達式(1):開篇
    2、一旦用過了再也回不去的「神器」正則表達式是典型的那種你沒用過的話,不覺得對自己有什麼影響,可是一旦用過了,就再也回不去了的「神器」。2、其他難學的原因當然,正則表達式之所以難學、難理解,除了由於正則表達式具有高度簡潔、高度抽象的特點之外,大致上應該還有以下幾個原因:1)學習者不求甚解,不了解正則引擎內部的基本原理作為正則表達式的使用者,不需要深入了解正則引擎內部原理的技術實現細節
  • python由圓半徑計算圓的周長和面積
    要計算圓的周長和面積,自然而然就要用到圓周率π,在我國,祖衝之在劉徽開創的探索圓周率的精確方法的基礎上,首次將「圓周率」精算到小數第七位,即在3.1415926和3.1415927之間,他提出的「祖率」對數學的研究有重大貢獻。直到16世紀,阿拉伯數學家阿爾·卡西才打破了這一紀錄。
  • 小學1-6年級數學概念整理
    例如:0、2、4、6、8、10……註:0也是偶數 2、不能被2整除的數叫基數。例如:1、3、5、7、9…… ■整除的特徵 1、能被2整除的數的特徵:個位上是0、2、4、6、8。例如,勻速運動中的速度v、時間t和路程s的關係是s=vt。 第三,用字母表示數,便於從具體情境中抽象出數量關係和變化規律,並確切地表示出來,從而有利於進一步用數學知識去解決問題。例如,我們用字母表示實際問題中的未知量,利用問題中的相等關系列出方程。 ■字母和表達式在不同場合有不同的意義。
  • 俠隱閣各屬性數值計算公式 屬性數值換算方法
    俠隱閣中屬性數值是有計算公式的,很多玩家還不清楚這些屬性的計算公式是什麼,下面就來為大家分享一下。vit*0.2+dex*0.8+spi*0.5基礎防禦str*0.2+vit*1.2+dex*0.5+spi*0.8氣血上限str*1+vit*2.5+dex*1+spi*1.5真氣上限str*1+vit*1.5+dex*1+spi*2基礎移動力math.min(1,(dex/120))+math.max(0,((dex-120)/200))
  • 一文介紹機器學習中基本的數學符號
    例如:加法:1 + 1 = 2減法:2 – 1 = 1乘法:2 x 2 = 4除法:2 / 2 = 1大多數的數學運算都有一個對應的逆運算,進行相反的運算過程;比如,減法是加法的逆運算,而除法是乘法的逆運算。代數我們常希望用更抽象的方式來描述運算過程,以將其與具體的數據或運算區分開來。
  • 用一個寒假,根治數學計算慢、粗心難題
    據高考閱卷統計,在高考數學平均因為計算錯誤丟的分是12.67分。學習挺認真,計算總丟分,也許是習慣和規範沒找到。  裡面仿佛隱含一個假設:孩子年齡增長了,不用專門教,自然而然就能掌握更複雜的計算。至於這個假設是否成立,各位家長回憶一下高中當年被解析幾何支配的痛苦,應該自己會有答案。  問題說清楚了,接著聊解決方案。大部分家長和孩子碰到計算問題,歸因總是兩個字:「馬虎」,解決方案總是四個字:「下次認真」。
  • 國家公務員考試行測數學運算之尾數計算法
    國家公務員考試行測數學運算之尾數計算法由國家公務員考試網高分經驗欄目由提供,更多關於國家公務員考試,申論,行測,列印準考證,國家公務員考試高分經驗的內容,請關注國家公務員考試網/廣東公務員考試網!
  • AEAI BPM V3.0.2 開源發布,流程集成平臺
    本次開源發布的是AEAI BPM V3.0.2版流程集成平臺,該版本是數通暢聯首次正式對外發布的版本,產品現已開源並上傳至開源社區http://www.oschina.net/p/aeai-bpm
  • 2個220V的火線為什麼就成380V了?
    為什麼兩個220v火線的電壓測量之後是380v呢?那麼怎麼計算這兩相之間每時每刻的電壓差呢,通過數學計算,(當然開始是用正弦來帶入計算的),科學家們很聰明的引入了向量這個方法來計算,這就會大大的減少計算量,如下圖是星型接發的相位圖。通過上圖向量計算,我們可以得出UAB為380v,是UA、UB的根號三倍,當然,我們所說的380v是指電壓有效值。
  • 三年級數學上期末模擬卷(可列印 答案 必考題 常考題 考點解析)
    三年級數學上冊期末測試卷(可列印答案重點突出 常考題 考點解析)三年級數學上冊的重要考點:探究性數學課題——集合問題集合是近代數學中的一個重要概念。小學數學教學活動常常把點、數、圖、式放在一起作為討論和研究的對象。
  • 學會使用正則表達式——驗證郵箱地址格式
    [a-zA-Z0-9_]+)"這段正則表達式比前面的正則表達式複雜了許多,是不是感覺不太容易理解,這一長串字符和符號的組合都有什麼含義呢?首先,我們以字符串「[@]」為分隔串將正則表達式分為兩部分。第一部分是:「\w+」第二部分是:「[a-zA-Z0-9_]+(\.
  • 搭2.0升引擎+特殊外觀,限量發售70臺
    馬自達CX-3百年紀念版開售搭2.0升引擎/特殊外觀-圖1" src="https://x0.ifengimg.com/res/2021/5CB4B933057EA2C0EE45DAFD251C3DE9947B8ABA_size68_w680_h510.jpeg" data-imagewidth="680" data-imageheight="510"> 馬自達CX