【明日方舟】眾所周知,肉斬骨斷人人都會

我們來進(jìn)行一個(gè)簡單的計(jì)算。
突襲的提亞卡烏冠軍強(qiáng)化后的攻擊力為1100,其天賦效果為,在被阻擋時(shí),將自身與對方的防御最終削減70%。
已知盾衛(wèi)的防御為1000,削減70%之后剩下300,每次被打掉血800點(diǎn),在被提亞卡烏冠軍攻擊25次之后會與對方同歸于盡……才怪咧!
如圖所示,盾衛(wèi)的血量為0,但依舊存活,這又是怎么做到的呢?
0血存活這并不是什么新鮮事了,但此前的0血存活都是通過精準(zhǔn)的控制與繁復(fù)的計(jì)算,利用干員的法抗讓剩余血量為一個(gè)小于0.5的小數(shù),繼而被顯示的舍入規(guī)則顯示為0血。
但從盾衛(wèi)這里看,提亞卡烏冠軍的攻擊力是物傷,似乎并不涉及小數(shù)方面的傷害,而這個(gè)削防效果似乎又不會產(chǎn)生任何小數(shù),如果明日方舟沒有一個(gè)血量小于0才判斷干員強(qiáng)制退場的機(jī)制,那么肯定是某些地方的計(jì)算過程中引入了小數(shù)。
作為一個(gè)有基本計(jì)算機(jī)常識的人來說,第一眼看到覺得有問題的地方就是那個(gè)0.7。
有很多人可能會覺得,0.7不是很正常的一個(gè)有限小數(shù)嗎?它乘以10之后就沒有小數(shù)部分了啊,更何況是乘以1000之后呢?
但0.7在二進(jìn)制下并不是有限小數(shù)。
如果有點(diǎn)計(jì)算機(jī)常識的人,估計(jì)已經(jīng)知道我要說什么了。
但考慮到很多人對于進(jìn)制這個(gè)東西的本質(zhì)在課堂上并沒有認(rèn)真聽,這里也簡單復(fù)述一遍吧。
首先,我們常用的十進(jìn)制,其基底為10,所有十進(jìn)制數(shù)都可以寫為10的不同整數(shù)次冪之和。
比如233就是2×10^2+3×10^1+3×10^0。
其他進(jìn)制也一樣,比如十進(jìn)制下的7,在二進(jìn)制下為111,也就是1×2^2+1×2^1+1×2^0。
小數(shù)方面也一樣,
比如0.7就是7×10^-1,但這里來了一個(gè)問題——0.7并不能寫成2的整數(shù)次冪之和,且每一項(xiàng)的系數(shù)均小于2。
因此0.7在二進(jìn)制下是無限循環(huán)小數(shù),寫成二進(jìn)制是0.101100110011001100……循環(huán)節(jié)從小數(shù)點(diǎn)后第二位開始,長度為4。
然而計(jì)算機(jī)并不能識別無限循環(huán)小數(shù),也不可能分配無限的空間去存儲一個(gè)數(shù),這就涉及到儲存數(shù)字的形式了(Windows自帶的計(jì)算器其實(shí)里面的算法挺復(fù)雜的,并不是計(jì)算機(jī)課上學(xué)二叉樹、堆棧時(shí)候用到的那么簡單)
明日方舟儲存數(shù)字使用的是64位定長小數(shù),前32位保存整數(shù)部分,后三十二位保存小數(shù)。
0.7用這個(gè)形式儲存下來的結(jié)果是:
0.10110011001100110011001100110011
我們將其再轉(zhuǎn)換為十進(jìn)制,看看結(jié)果:
0.6999999999534339....(后面的小數(shù)位就不寫了)
結(jié)果很顯而易見,這是一個(gè)小于0.7的數(shù)。
因此,如果將70%以0.7的形式保存起來,其實(shí)際結(jié)果是一個(gè)略小于0.7的數(shù)字。
那結(jié)論就很明顯了,實(shí)際上每一次提亞卡烏冠軍對盾衛(wèi)造成的傷害只有799.99999……
這個(gè)取整足夠小,以至于25次甚至2500次之后,都能夠讓理論上剛好歸零的血量顯示為0,但又足夠明顯,以至于系統(tǒng)不會做出該干員生命值已歸零,需要強(qiáng)制退場的決定。
我也沒想到我這次能在直播中打出這么具有戲劇性效果的結(jié)論,但綜合來說這個(gè)的復(fù)刻并不算難,精二50級無潛落地三充能的艾雅法拉及時(shí)入場將三發(fā)點(diǎn)燃都打在冠軍身上,剩下的讓冠軍和盾衛(wèi)單挑,就能打出這樣的效果了,或者你有其他的控血方案也可以?
想要減少這種情況很簡單,將70%寫成70/100先計(jì)算x70再計(jì)算÷100就行,不要寫成0.7。