手机回文
印象中好像在板上看过不少次相关讨论了
觉得好像可以来简易科普一下
不知道发了会不会有点扫兴,不过还是简介一下
关于算术这件事情,其实就理论而言都很理想跟直观
但真的牵扯到实作的时候,就会衍生很多细节
先来简单举个例子:
假设现在要做算术运算,而你只有一张纸
上面只有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的范畴,而是否打死也只是一个比较逻辑而已