程式語言的高精度計算/浮點數計算的問題,以 0.58 * 100 為例

SafeMath

程式語言精度計算/浮點數計算的問題早已不是都市傳說,問題出在某些浮點數無法準確地使用二進制表示,所造成的「錯誤」。但每次聽到或見到年輕軟體工程師因此踩坑,也還是會捏出一把冷汗,倘若是發生在對數字極度敏感的場景,是難以收復的。

常理來說,0.58 x 100 應為 58,但在某些程式語言裡,在不進行「特殊」處理下,答案會為 57 而非 58。

本文嘗試整理各程式語言遇到此類計算時的結果,而解法不外乎就是『使用支援高精度的函式來處理』,目前各程式語言都有對應的解法,此不詳述。

Open Source 的商業模式?Elasticsearch 是不是要開始收費了?從 Elastic 與 Amazon 對 Elasticsearch 的開源授權爭議談起

Open Source

近日 ElasticAmazonElasticsearchKibana 的軟體授權協議上,進行了幾次隔空交火。

  • 對於使用者而言,比較關心的是『當 ElasticElasticsearchKibana 的軟體授權協議更改後,對我有什麼影響?未來是不是要付費了?』;
  • 對於創業或行銷領域的人,比較關心的是『自由開放源碼真的能賺錢嗎?怎麼樣的商業模式 (或稱為營利模式) 才是對的?』;
  • 對於自由開放源碼授權領域的人,我們討論更本質的問題,『自由開放源碼有沒有商業模式?』。

讓我們先從此次事件談起。

多環境多語言下保持生產環境獨立的軟體開發方式:在容器內開發 / Programming in Container

Programming in Container - Docker

這篇文章會分享我如何利用容器 (Container) 來依據產品或專案,分門別類的管理並隔離各種程式語言開發環境及其版本。

為了解決各種疑難雜症,我很常需要在各式各樣的開發環境來回切換,諸如 PythonGoPHPNodeJava 等,若再加上版本號,如 Python 2 / 3、Node 8 / 12、Java 1.8 / 11,則組合方式更為多元且複雜。這不僅容易弄亂生產環境,有時還會彼此發生衝突。

過去我會採用系統預載的版本,例如 Ubuntu 18.04 預設為 Python 2.7,然後再加上 Version Control 工具 (如 pyenv) 來新增 Python 3 環境,再用 virtualenv 來隔離模組。但到了容器化 (Containerization)時代,我們可以有更整潔的解決辦法。