有什麼比較好的方法可以快速準確的開出七次方嗎?

這是個數值分析的題目。問題起因是溫大的這句話:

「面試是一件比較看緣分,但是又有統計性規律的事,比如刨除熟人因素,你讓我再走校招面一次阿里,我沒太大把握通過,但是你說我面FLAGBAT幾家,一個offer都拿不到的可能性應該接近0。」

根據最後一句,統計學上的小概率事件一般取0.03,把這數開七次方就是答案了。所以有什麼比較好的方法可以快速準確的開出七次方嗎?二分逼近太慢了。


你們這幫傻蛋, @winter的意思是「再走校招面一次阿里,我沒太大把握(我提出的薪水底線阿里的HR能)通過」。


答案大概是0.606,也就是說溫大超過一半的概率過不了面試......

使用牛頓迭代可以得到解,但是收斂仍然不夠快,選1為初值差不多要迭代9次才能穩定。Newton迭代使用的公式如下:

x_{n+1} = x_{n} - frac{x_{n}^{7} - 0.03 }{7x_n^6}

使用Scala編程實現如下:

scala&> def extract7(init:Double, product:Double):Stream[Double] = init #:: extra
ct7(init-(math.pow(init, 7)-product)/(7*math.pow(init, 6)), product)
extract7: (init: Double, product: Double)Stream[Double]

scala&> extract7(1, 0.03).take(20).last
res2: Double = 0.605962702113601

以上,牛頓迭代只是能用,但性能談不上優異,權當拋磚引玉。


看到有用牛頓迭代的,我給個基於中學數學知識的心算解法吧(剛坐公交的時候心算出0.606),博君一笑,順便向溫趙輪組合致敬。

首先求初猜值。0.03的七分之一方很適合用對數再指數去算。先用對數:1/7(-2+lg3)。記得我們那時候初中是要求背2,3,5的lg值的。不過lg3很容易估,略小於0.5(3^2為9),所以指數項約為-0.2x。暫時忽略百分位,估算出10的5次方根即可,大約在1.6左右(小學時老師要求背過20以內自然數的平方,所以不難估算出)。1/1.6=0.625,實際肯定比0.625小一點,因為剛才忽略了百分位。精確到十分位0.6是初猜值。6^3是216,所以容易得出0.6^7大約在0.028左右。

需要把0.028放大7%左右才能得到0.03,而7%對應為輸入端的1%(因為是求1/7次方,利用二項式展開),所以0.6*1.01=0.606。注意,如果轉換為輸入端的因子大於1%,很可能就要修正計算了。1%的好處是二項式展開時可以忽略2次項及以上的部分。


如圖,校招不好說,如果問的是現在溫神的水準,國內的互聯網公司只是他想去哪家的問題。


這個題目應該是來黑阿里的HR的……


我記得之前有一個開根號的神演算法,用的是移位運算元,理論上,同樣的方法也能用到這裡吧。不過前提是得用計算機算,但是用計算機算的話那就用不著這麼費勁了。心算的話還是Arthur的比較合適。


Python 大法好唄


推薦閱讀:

研究數值分析的真正用途是什麼?從長遠來說,有必要研究數值分析嗎?
使用 epsilon 比較浮點數是否不夠科學?
如何用牛頓迭代法求一個三元函數f(x,y,z)的一個極小值?

TAG:面試 | 數值分析 |