当我写了个BUG却变成核心玩法青衫取醉
第469章 0.1+0.2≠0.3(第3页)
顾凡赶忙打开电脑,尝试着搜索了一番,很快就定位到了罪魁祸首——诸葛君发布的那个视频。
在视频中,诸葛君把这个bug的复现方式给详细地讲述了一番。
这很快在玩家群体中引发了轩然大波,很快,玩家们群策群力,不仅验证了这个bug的真实性,还在此基础上做好了成神结局的全部路线规划。
也有up主已经在着手制作用这种方式最快打出成神结局的视频攻略。
而一旦视频攻略做出来,玩家们打出成神结局的难度必然大大降低!
这对于莉莉丝来说,简直不啻于惊天噩耗!
“为什么会出现这样奇怪的bug!!
“顾凡,给我查!给我狠狠地查!”
莉莉丝很愤怒,她完全无法理解这到底是怎么回事。
不过这次,顾凡压根都没去翻代码,而是立刻就给出了大致的判断。
“这看起来……大概率是浮点数误差导致的经典Bug,也就是int型和浮点型运算的转化出现了一些小纰漏。
“动态难度恰好生成了一个特殊的分数,在系统刷新时,分数卡在临界点,变成了一个系统无法正确识别的数据,从而产生了错误的应答,游戏的动态难度就自动降为了最低难度。”
莉莉丝听得一头雾水:“……你说人话!”
顾凡轻咳两声:“好吧,那我换更加通俗的方式来解释。
“不过在此之前,我觉得有必要给莉总你科普一下一些程序的基础知识,否则就算我说破天,你也不会理解为什么出现了小数就会有这种离谱的bug。
“首先,莉总你知不知道在程序里面,0.1+0.2≠0.3?”
莉莉丝有些震惊地张大嘴巴:“为、为什么?”
顾凡解释道:“在现实中0.1+0.2当然是等于0.3的,但在程序里不是,因为程序是二进制的。我们想要把十进制转化成二进制,需要用到‘除2取余法’,也就是说,把十进制的8转化成二进制,那么就需要除四次2,余数分别是0、0、0、1,那么最终转化出来的二进制结果,就是1000。
“但这是整数的转换,当遇到负数、小数的时候,情况又会有一些区别。
“这里我就不展开讲了,总之,想要将十进制的小数转化为二进制,就需要用到‘乘二取整法’,我们先把整数部分十进制转二进制,再把小数部分十进制转二进制,最后再把两个二进制数字的结果进行合并,就得到了一个小数在二进制下的数字。
“但这里有个问题,那就是只有极少数的小数可以通过乘二取整法来完整地转化,还有大量的数字在转化成二进制之后,是无限循环的。
“就比如,十进制的0.1在转化成二进制之后,会变成0.0001100110……而由于计算机的资源是有限的,我们不能直接记录这一长串的数字,就只能记录一个最大化接近0.1的二进制数,这就会造成精度缺失的情况。”
顾凡一边说着,一边在电脑上快速地运算,帮助莉莉丝理解。
而莉莉丝则是眉头紧锁,显然大脑已经处于过载状态,但在顾凡一步一停的耐心解释下,倒是也勉强理解了七七八八。
(本章完)
在视频中,诸葛君把这个bug的复现方式给详细地讲述了一番。
这很快在玩家群体中引发了轩然大波,很快,玩家们群策群力,不仅验证了这个bug的真实性,还在此基础上做好了成神结局的全部路线规划。
也有up主已经在着手制作用这种方式最快打出成神结局的视频攻略。
而一旦视频攻略做出来,玩家们打出成神结局的难度必然大大降低!
这对于莉莉丝来说,简直不啻于惊天噩耗!
“为什么会出现这样奇怪的bug!!
“顾凡,给我查!给我狠狠地查!”
莉莉丝很愤怒,她完全无法理解这到底是怎么回事。
不过这次,顾凡压根都没去翻代码,而是立刻就给出了大致的判断。
“这看起来……大概率是浮点数误差导致的经典Bug,也就是int型和浮点型运算的转化出现了一些小纰漏。
“动态难度恰好生成了一个特殊的分数,在系统刷新时,分数卡在临界点,变成了一个系统无法正确识别的数据,从而产生了错误的应答,游戏的动态难度就自动降为了最低难度。”
莉莉丝听得一头雾水:“……你说人话!”
顾凡轻咳两声:“好吧,那我换更加通俗的方式来解释。
“不过在此之前,我觉得有必要给莉总你科普一下一些程序的基础知识,否则就算我说破天,你也不会理解为什么出现了小数就会有这种离谱的bug。
“首先,莉总你知不知道在程序里面,0.1+0.2≠0.3?”
莉莉丝有些震惊地张大嘴巴:“为、为什么?”
顾凡解释道:“在现实中0.1+0.2当然是等于0.3的,但在程序里不是,因为程序是二进制的。我们想要把十进制转化成二进制,需要用到‘除2取余法’,也就是说,把十进制的8转化成二进制,那么就需要除四次2,余数分别是0、0、0、1,那么最终转化出来的二进制结果,就是1000。
“但这是整数的转换,当遇到负数、小数的时候,情况又会有一些区别。
“这里我就不展开讲了,总之,想要将十进制的小数转化为二进制,就需要用到‘乘二取整法’,我们先把整数部分十进制转二进制,再把小数部分十进制转二进制,最后再把两个二进制数字的结果进行合并,就得到了一个小数在二进制下的数字。
“但这里有个问题,那就是只有极少数的小数可以通过乘二取整法来完整地转化,还有大量的数字在转化成二进制之后,是无限循环的。
“就比如,十进制的0.1在转化成二进制之后,会变成0.0001100110……而由于计算机的资源是有限的,我们不能直接记录这一长串的数字,就只能记录一个最大化接近0.1的二进制数,这就会造成精度缺失的情况。”
顾凡一边说着,一边在电脑上快速地运算,帮助莉莉丝理解。
而莉莉丝则是眉头紧锁,显然大脑已经处于过载状态,但在顾凡一步一停的耐心解释下,倒是也勉强理解了七七八八。
(本章完)