豬年快到了,還記得在我在雞年立了個flag,計劃在狗年推出《紙書科學計算器》的2.0版本(HowardZ:近來的一些修修補補)。然而現實很骨感,我因為時間太緊而咕咕了……就此陷入了人類三大本質之一。

本以為大家不會特別在意,但我卻收到過類似下圖的郵件,讓人不由心裡一緊,所以還是決定過來公開一下進度為好。

這一年都沒來得及更新的原因其實比較複雜,研究生開學以後轉向機器學習

,整天讀論文開組會是一個原因;之前1.x版本的代碼風格不好,想刪檔重來也是一個原因;最大的原因就是挖的坑太大:由於想在新版本實現任意精度的運算(有不少用戶詬病精度太低、浮點運算bug和大數運算報錯等問題),就試圖用高精度演算法重寫底層的運算實現。

換個簡單的說法,高精度運算就是用鏈表或數組來存儲一個數值的每一位,在此基礎上自行實現加減乘除乃至對數、三角函數

等等。因為放棄了電腦自帶的浮點數運算,理論上不再有精度問題。於是在去年,我就給自己挖了個大坑:開發一個基於.NET Core的高精度科學計算庫,計劃支持實數、複數、表達式、矩陣的科學計算,並在後期加上幾何模塊。

所以……知道這是多大的坑了吧!與其說這是一個工程問題,不如說是個數學問題,事實上這屬於一個專門的數學分支學科——數值分析。我在開發時也覺得自己有點不自量力,所以只能邊做邊學慢慢來。

為了便於管理這個項目,我決定把它開源到github。開源是對自己持續開發的一種激勵,當然也歡迎有興趣的大佬貢獻力量。項目名叫NaturplayMath,是一個.NET Core類庫。

NaturplayMath項目規劃

  • 實現高精度數值的常用運算符和初等函數的運算
  • 在高精度數值基礎上封裝有理數、無理數,支持輸出分數形式或者保留根號的運算結果,而非數值結果(使結果更友好)
  • 在高精度數值基礎上實現複數模塊,並實現複數的基本運算
  • 在高精度數值基礎上實現矩陣模塊,並實現常用的線性代數演算法
  • 實現基本的表達式符號計算,支持導出和導入TeX公式
  • 以上是NaturplayMath代數模塊的規劃,為項目第一階段,幾何模塊和其他模塊不在第一階段內

目前進度

  • 實現了高精度數值的數據結構(基於鏈表)
  • 實現了高精度數值的進位轉換、比較、加法、減法、左移、右移運算
  • 實現了高精度數值的乘法運算(樸素演算法),之後計劃用傅里葉變換和FFT演算法優化
  • 實現了高精度數值的除法運算(已使用二分查找部分優化)
  • 實現了高精度數值的開平方運算(已優化,為避免引入高精度乘除法,完全用移位和高精度加法實現了快速開方)
  • 實現了高精度整數的最大公約數、最小公倍數運算
  • 通過封裝高精度數值實現了實數類、有理數類及若干子類
  • 實現了有理數的約分、通分、加減乘除等運算

當然,在實踐的同時,我可能會在本專欄發表一系列關於高精度演算法具體實現的文章,介紹一下我的理解,也避免自己在斷斷續續的開發過程中遺忘之前的思路。

該項目的github地址:

zamhown/NaturplayMath?

github.com
圖標

由於剛剛創建repo,各方面還顯得很簡陋。隨著項目發展會擴充README並採用英文寫文檔和注釋,還望多多包涵~

推薦閱讀:

相关文章