手機回文
印象中好像在板上看過不少次相關討論了
覺得好像可以來簡易科普一下
不知道發了會不會有點掃興,不過還是簡介一下
關於算術這件事情,其實就理論而言都很理想跟直觀
但真的牽扯到實作的時候,就會衍生很多細節
先來簡單舉個例子:
假設現在要做算術運算,而你只有一張紙
上面只有10個格子,而且你只能寫下0-9
最直觀的方法就是寫下多少就是對應的十位數整數
然後此時就可以推論出一些限制:
1. 範圍為0-9999999999的整數
然後就會問說,那負的怎麼辦?
所以我們把第一格寫1表示負0表示正
於是範圍變成 -999999999~999999999
雖然可以表示負數了,但最大值也被壓縮
但可能目前實務上不太可能超出上下界
於是乎開發人員就這麼決定了表示式
而過了好幾年,數字運算上開始會有超出範圍的需求
可能就會有人提出建議
「用科學記號不就好了,國中沒畢業嗎?」
好的,於是我們改變表示式的定義:
前八碼為科學記號前面的數字,後兩碼為10的次方
比方說 1 2 3 4 5 6 7 8 9 9 表示 1.2345678 * 10^99
若是有負的需求就再讓一格,而這樣改進以後
上下界的範圍被大大提升了,感謝這位聰明的先知
其實類似的概念就是變數型態裡面的浮點數
而為什麼這麼簡單的道理人家卻不採用呢?
現在我們回來思考一個問題:
以上述例子而言,表示式是怎麼對應到值域內的?
十個格子,無論怎麼表示,都最多只能表示100億個數字
而只有整數表示是可以在範圍內全部列舉的
這也是浮點數運算一個危險的地方,精準度
對電腦運算上,(1e50+1) - (1e50) 答案可能不會是 1
通常浮點數也是拿來算個近似值而已
以算傷害的需求而言我想並不太適當
最後做個總結:
1. 數值運算有上下界是因為實作限制
2. 整數運算較具有精準性
但回歸目前的使用狀況,要能不怕超出範圍也不是不可能
定義一個變數型態,然後覆寫四則運算及比較邏輯
讓它可以動態擴張自己的記憶體大小應該就可以達成
畢竟怪的血量目前不會超出int的範疇,而是否打死也只是一個比較邏輯而已