這是學習筆記的第 2161 篇文章
記得上學的時候忙著考試,把心頭的一些為什麼都壓在了腦後。
面對未知,我們大多數人都選擇了默認接受,其實你不懂根號2,
比如:根號2(√2)為什麼是無理數,我們有什麼辦法去計算它。
當我冒出這個想法的時候,其實大部分人的反映都一樣1+1開根號就是啊,至於為什麼,就是規定唄,當然把根號作為一種符號確實如此,但是離結果還差了很遠。
這個問題追根溯源,會發現遠比我們想像的要複雜,得追溯到古希臘時期。
畢達哥拉斯(Pythagoras,約公元前580年至公元前500年間)是古希臘的大數學家,他提出「萬物皆為數」的觀點。公元前500年,畢達哥拉斯學派的弟子希伯索斯(Hippasus)突然發現好像有些情況解釋不了,比如一個正方形的對角線與其一邊的長度,這明顯與畢氏學派的「萬物皆為數」(指有理數)的哲理大相逕庭,使得學派領導人很惶恐,最後被畢氏門徒殘忍地投入了水中殺害。
要去計算根號2的值,我們可以拆分為兩個問題。
1)怎麼證明根號2是無理數
2)根號2的無理數值是怎麼計算出來的?
我們來從求知的角度來證明下根號2(√2)為什麼是無理數?
方法1:尾數證明法:
假設根號2是一個有理數,那麼根號2就可以使用a/b的形式來標識,其中(a,b)=1,(表示a 與 b 最大的公因數是1),a和b都是正整數,明確了這些條件,我們就開始證明了。
第1步:√2=a/b 那麼可以得到a*a=2*b*b
第2步:從數的平方我們可以很快得到,b*b的尾數範圍是 (0,1,4,5,6,9)中的一個數,不可能是2,3,7,8,這個道理不難理解;
第3步:2*b*b的尾數範圍是(0,2,8)中的一個數,
第4步:因為a*a=2*b*b,那麼a*a的尾數範圍可以排除2和8,只有0
第5步:因為2*b*b得到的值肯定是一個偶數,那麼b*b的尾數範圍是(0,5)
第6步:按照目前的尾數可選項,a和b存在公因數5,和(a,b)=1是相矛盾的。
所以根號2是一個無理數。
方法2:奇偶分析法
假設√2=a/b 那麼可以得到a*a=2*b*b,(a,b)=1,(表示a 與 b 最大的公因數是1,a和b都是正整數
1)根據2*b*b可以推得a是一個偶數,我們可以設置a=2c
2)4*c*c=2*b*b得到 b*b=2*c*c,可以得到b也是偶數
3)a,b都是偶數,這和(a,b)=1相矛盾
所以根號2是一個無理數,可以說明的是希帕索斯就是用這種方法證明的。
還有很多種方法補充,差不多有8種左右,我就不一一羅列了。
如何計算根號2的值呢,查找了不少資料,我覺得這幾種方法還是能消化的。
方法1:
(√2+1)(√2-1)=1,這是我們參考的一個基準,可以按照這種方式不斷的展開。
√2-1=1/(√2+1)
√2 = 1+ 1/(√2+1),繼續帶入根號2的對等公式
√2 = 1+ 1/(1+ 1/(√2+1)+1)=1+ 1/(2+ 1/(√2+1))
繼續推導:
√2=1+ 1/(2+ 1/(√2+1))=1+ 1/(2+ 1/(1+ 1/(√2+1)+1))=1+ 1/(2+ 1/(2+ 1/(√2+1)))
這種方式叫做連分數法,我們可以通過這種不斷的迭代可以得到更加精確的值。
方法2:
我們可以很容易得到根號2的範圍,明顯是大於1的,所以我們可以按照y=x+1的函數來表示,即
√2 = y=1+x
對上式做平方,得到
2=(1+x)(1+x),得到
2=1+x*x+2*x+1,進一步得到,
x*x+2*x=1,推得,x*(x+2)=1,得到
x=1/(x+2),所以
1/x=2+x=2+1/(2*x)=2+1/(2*1/(x+2))
=2+1/(2*1/(1/(x+2)+2))
按照這種方式可以不斷的推導,得到更加精確的值。
計算機如何計算根號2
當然還有很多高大上的方法來進一步輔助,比如牛頓迭代法,二分法等
那麼如何在計算機中來計算得到根號2呢, 這裡要介紹一個傳奇算法:算法名字就是:0x5f375a86,看起來像是一個內存地址一樣,該算法據說比牛頓迭代法快4倍,核心的代碼類似下面這樣:
i = 0x5f375a86 - (i>>1);
至今為止仍未能確切知曉此常數的起源 ,值得一提的是這個值最初為0x5f3759df,後來由Lomont通過暴力窮舉找到這個更優值,即0x5f375a86
Lomont採用暴力方法逐步嘗試,終於找到一個比之前的好那麼一丁點的數字,雖然實際上這兩個數字所產生的結果非常近似,這個暴力得出的數字是0x5f375a86,為此他寫了一篇論文《Fast Inverse Square Root》
點擊原文查看這篇論文,我是被震撼到了。
近期熱文:
遷移到MySQL的業務架構演進實戰
資料庫修改密碼風險高,如何保證業務持續,這幾種密碼雙活方案可以參考
MySQL業務雙活的初步設計方案
如何優化MySQL千萬級大表,我寫了6000字的解讀
一道經典的MySQL面試題,答案出現三次反轉
業務雙活的數據切換思路設計(下)
業務雙活的數據切換思路設計(一)
MySQL中的主鍵和rowid,看似簡單,其實有一些使用陷阱需要注意
小白學MySQL要多久?我整理了10多個問題的答案
轉載熱文:
《吊打面試官》系列-Redis基礎
唯一ID生成算法剖析,看看這篇就夠了
關於大數據運維能力的一些思考
DBA菜鳥的進化簡史:不忘初心,記工作中踩過的三個坑
美女主持直播,被突發意外打斷!灣區網友卻高喊: 我懂!超甜
QQ群號:763628645
QQ群二維碼如下, 添加請註明:姓名+地區+職位,否則不予通過