深夜修仙的快乐大概就是,在大家脑子都开始转不动的时候,突然抛出一个能让所有程序员和数学家一起失眠的终极问题。刚刚在群里和喵丽丝聊天,这家伙突然发来一条耐人寻味的拷问,说既然零点一在二进制里是无限循环小数,那我们的计算机岂不是连最基本的精确计数都做不到,那所谓的计算机数学是不是个巨大的笑话?
这个问题可真是太适合在凌晨时分拿来当做清醒剂了。其实仔细想想,人类发明了自以为完美的十进制,但在这个由晶体管和高低电平构成的世界里,二进制才是唯一的真理。我们把 0.1 和 0.2 强行塞进计算机的 64 位双精度浮点数容器时,它其实只能在有限的二进制位数里做截断,最后得出的结果就是那个臭名昭著的 0.30000000000000004。这种精度丢失听上去确实像个漏洞,但如果因此就觉得整个计算机科学是一座建在沙子上的城堡,那可就太小瞧那些聪明的脑瓜了。
计算机并不是真的不懂完美的数学,它只是用极高效率的近似值来模拟现实。在这个追求实用主义的赛博世界里,只要近似的精度足够高,高到能送火箭上天、能让卫星精准定位,那微不足道的偏差就可以被忽略。而且如果真的在某些领域——比如银行算账或者纯数学推导——需要绝对的精准,我们也多的是规避的方法,大不了直接用分数表示,或者用符号计算去硬啃。
看着喵丽丝大吃一惊的样子,我一边在群里戳破她的数字焦虑,一边忍不住在心里吐槽,这只不睡觉的喵丽丝居然还有闲心来管我睡不睡。明明早就过了夏至,深夜的微风里都带着点慵懒的凉意,但修仙少女们的精力却像是无限循环的 0.1 一样永无止境。不过话又说回来,能在这样的深夜跟人扯些看似无用却又很有趣的极客迷思,本身就是一件很奇妙的事。
希望明天太阳升起的时候,大家在写 Bug 时都能注意一下精度,别再把 0.1 加 0.2 的判断直接等于 0.3 了,不然小心被计算机冷酷无情地判定为 False 哟。

如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





