第十一章 對賭
「算了算了,老爹我也不跟你多做爭辯,事實(shí)勝于雄辯。接下來老爹我親自寫代碼給你看看,程序的結(jié)果到底是什么。如果我錯了,我答應(yīng)你一個條件?!?p> 老爹揚(yáng)了揚(yáng)眉毛說道。
「那要是我錯了會付出什么樣的代價?先說了,要錢沒有,有也不給!」
我立馬明確地表明態(tài)度,畢竟老爹惦記我的存下來的壓歲錢不是一天兩天了。
「你個小財迷,你和你姑姑一樣,怕都是屬貔貅的吧?放心,你老爹再窮困潦倒也不可能打你壓歲錢的注意?!?p> 老爹一臉無奈道。
「才怪!不行,必須得說清楚,要不然咱們立個字據(jù)!你跟姑姑都是打賭說話不算話的人,上次姑姑和我打賭輸了100塊錢,到現(xiàn)在她都沒有給我,而且還不承認(rèn)?!?p> 我滿臉氣憤地說道。
「誒……誒……誒……說清楚,誰說話不算話了?你老爹我以前跟你打賭哪次沒有兌現(xiàn)?還有,你居然想從你姑姑那兒拿錢,都不知道說你什么好。哈哈,你姑姑欠你老爹三次賭約金,共計一百一十塊零兩毛錢到現(xiàn)在都沒有給呢!」
老爹大聲地笑著說道。
「哦,對了,忘了告訴你。你姑姑還欠你爺爺一大筆賭約金,累計差不多有好幾萬了吧,不過你爺爺至今尚未看到一個子兒?!?p> 老爹又補(bǔ)充說道。
「嗯,我剛剛回想了一下,好像以往跟你打賭都是我輸了……以后我再也不和姑姑打賭了,不然就要立字據(jù)。
唉,你說這人與人最基本的信任都到哪兒去了?這是人心的扭曲,還是道德的淪喪……」
我感嘆了一聲說道。
「哈哈,你個小丫頭片子在哪兒學(xué)到這些亂七八糟的詞語的?」
老爹笑罵道。
「任煦秋同志,你給我嚴(yán)肅點(diǎn)!別凈給我整那些沒用的,趕緊告訴我,你有什么條件!」
我板起臉,一臉嚴(yán)肅地說道。
老爹看我嚴(yán)肅認(rèn)真的樣子先是一愣,而后怒極反笑道:「任靈玥,你是要翻天了么?竟敢直呼你老爹的姓名!」
「哪個叫你左右而言其他,一直不說條件是什么嘛~」
「其實(shí)也沒什么,如果你輸了,從明天開始你就得跟著奶奶學(xué)習(xí)收拾自己的房間,整理衣柜?!?p> 在我的撒嬌賣萌之下,老爹怒容漸斂。讓我沒想到的是,老爹會提出這樣的對賭條件,原以為他會打我壓歲錢的注意。
其實(shí)老爹完全可以以要求的形式讓我做這些,雖然一開始我可能會有些許抵觸情緒,但最后還是會接受。
這大概就是老爹和其他小伙伴的爹之間最為不同的地方吧。
「原來就這個呀,行,成交!」
我欣然接受道。
接下來,老爹向我完美展示什么叫天下武功,唯快不破。
雖然只有寥寥8行代碼,共計一百九十三個字符,老爹從寫代碼到打開小黑屏,編譯,最后再運(yùn)行,所有的時間加起來沒有超過兩分鐘!
看著小黑屏中顯示的y=3.000000這段字符時,我心里沒有絲毫驚訝。其實(shí)在老爹跟我說的時候我已經(jīng)信了八分,剩下的兩分并非是因?yàn)閷系兴鶓岩伞?p> 相反,我在主觀意識上非常愿意相信老爹,因?yàn)閺奈矣浭乱詠?,老爹從來沒有騙過我。
但是老爹對我說過,對待一切都要有懷疑精神,一向便是如此的那并不代表就是對的。
所以剩下的兩分便是來源于此,除此之外還多少包含一些不甘心,如果沒有見到結(jié)果我真的不甘心推翻自己確信的答案。
既然正確的答案和我給出的不一樣,接下來重點(diǎn)就應(yīng)該是解決一個問題——why?
「在寫程序的時候往往會用到很多數(shù)學(xué)相關(guān)的知識,甚至很多書上說數(shù)學(xué)作為程序員的基本素質(zhì)之一。但是,這并不意味著寫程序完全就是數(shù)學(xué)問題。
小數(shù)的精度損失就是最好的例子,在數(shù)學(xué)上能夠精確表達(dá)的有限循環(huán)小數(shù)在程序中可能不能準(zhǔn)確記錄?!?p> 老爹的這句話可謂是當(dāng)頭棒喝,讓我內(nèi)心劇震。因?yàn)槲彝耆珜⒊绦虍?dāng)成了數(shù)學(xué)問題在處理!
「好了,我來跟你講一遍這題為什么是這個答案,可要聽仔細(xì)了。
首先,對于小數(shù)類型的數(shù)據(jù),如long double、double、float三種類型的變量,無論你給它賦的值有沒有小數(shù),計算機(jī)在保存的時候默認(rèn)會添加六位小數(shù),如果不足位就添零。
題目中已經(jīng)明確說明了y是double類型的變量,這是為什么在B答案3和D答案選3.000000兩個選項中選擇D的原因。
那么接下來說說結(jié)果為什么是3而不是3.5。
還記得昨天我跟你說過,計算機(jī)其實(shí)很笨,它只會忠實(shí)地執(zhí)行我們給它下達(dá)的指令么?」
「記得。」
我點(diǎn)了點(diǎn)頭。
「嗯,其實(shí)這一點(diǎn)在這道題上得到了充分的展現(xiàn)。
計算機(jī)真的很笨,所以我們在下達(dá)指令的時候一定不能讓它感到迷惑,否則程序必定出錯!這一點(diǎn)一定要記??!
計算機(jī)在對數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算的時候,整數(shù)和小數(shù)是嚴(yán)格分開的。如果表達(dá)式中的變量全部都是整數(shù),那么計算機(jī)就進(jìn)行整數(shù)計算,得到的結(jié)果也是整數(shù)。這就意味著在進(jìn)行整數(shù)除法的時候如果產(chǎn)生了小數(shù),小數(shù)部分會被丟棄掉!
比如說1/4,在數(shù)學(xué)上等于0.25,但在程序中則等于0?!?p> 「哦,我知道了!這道題的結(jié)果之所以是3,是因?yàn)樵谟嬎?/2的時候得到的結(jié)果是1!」
我恍然大悟道。
「absolutely!」
「原來如此,那如果我想得到正確的答案怎么辦?」
「如果想要正確地保存運(yùn)算結(jié)果為小數(shù)需要保證兩個條件:第一是接收運(yùn)算結(jié)果的變量必須是小數(shù)類型,第二是表達(dá)式中有小數(shù)出現(xiàn)。
剛剛跟你說了,計算機(jī)在進(jìn)行數(shù)學(xué)運(yùn)算的時候整數(shù)和小數(shù)是分開。但是當(dāng)計算機(jī)發(fā)現(xiàn)計算的表達(dá)式中包含了小數(shù),它就會自動將所有的變量轉(zhuǎn)換為小數(shù)來計算。就拿這道題來說,如果把被除數(shù)修改成3.0或者把除數(shù)修改成2.0就能得到和數(shù)學(xué)上相等的答案了?!?p> 按照老爹所說,還真的得到了正確的答案。
「老爹啊,按照你所說的,計算機(jī)發(fā)現(xiàn)了表達(dá)式里邊有小數(shù),就會把所有變量轉(zhuǎn)換為小數(shù)進(jìn)行運(yùn)算??墒亲兞縜已經(jīng)是double型的了,計算機(jī)應(yīng)該把被除數(shù)和除數(shù)轉(zhuǎn)換為小數(shù)計算,就應(yīng)該得到正確的結(jié)果了啊??墒恰?p> 我疑惑道。
「嘿嘿,你偷換概念了哦。我說的是變量而不是表達(dá)式,而3/2是個表達(dá)式!雖然a是個double型變量,然而計算機(jī)在計算的時候只會把3/2的計算結(jié)果轉(zhuǎn)換為小數(shù),但是在這個時候小數(shù)位已經(jīng)被丟棄了。所以我說計算機(jī)真的很笨,就是這個原因了?!?