[アルゴリズム] 平方根を計算する 2

会社XXXの技術のインタビューで, プログラマ "長老"責任インタビューテオテオは、質問をします:

「Cプログラムは、平方根を計算書きます 2 整数のX "

テオは笑ったし、自分自身に考えた、「同社の主要な技術ベトナムは何という簡単な質問を. プログラミングを学ぶためにいくつかの新しい男ではありません!"

そして、テオは、フラッシュに、以下に示すコードで答えを配っ:


#include<math.h>
#include<stdio.h>

int main()
{
    int x;
    printf("Input x: ");
    scanf("%d", &x);
    printf("Sqrt of %d = %fn", x, sqrt(x));
}
Input x: 3
Sqrt of 3 = 1.732051

なしBIENプログラム 1 エラーと正しい結果.

テオ自信. そう愚かな質問をするXXX信じられないほどよく知られている会社! 彼は思いました.

経験豊富なプログラマのコードを見テオと表彰: "あなたは、基本的な持っています!". テオ幸せと私は確信していたと思いました 100% 仕事に取り掛かります. そこに他の古いプログラマー頼むで右手:
「あなたは、上の質問に答えます, Cライブラリ関数のsqrt」を使用しないように、この時間

ラブの質問は難しく思えます. テオは考え始めました. しばらくして彼は頭を悩ま開始しました. 今計算する方法? テオは思ったと思いました...

タイムアウト! インタビュアーは、テオのコメント: 「あなたはまだ多くのことを学ばなければなりません」. 彼が滑ったことを知っテオ悲しいです. しかしながら, それはより多くの抜け出すべきと考えているかどうか 1 新しい何か, それがインタビュアーを尋ねました:

"どのように私は平方根を計算することができます? 私は、コードの行数で複雑なアルゴリズムを必要としました?".

エリア開発者「シニア」笑って答えました: 「コンピュータは非常に高速な計算を行います, 代わりに絶対的な答えの, 私は、私は答えを推測するそれをキャッチできました!". トウモロコシの穴テオを見てみます, あなたの古いエンジニア、笑って優しくに説明.

Yの平方根は、そのような数xと定義されています: X2 そしてx = yが存在==します / X. xは、x = yの結果である場合 / X, そうでなければ結果になります 1 x 'は数がxとy / xの間にあります. これはあるのどのくらい知られていません, しかし、我々は持っています 1 取得する方法を推測します 1 平均値であるこのコミュニティ内の一部!

テオはうなずきました.

例: 平方根を計算する必要があります 2 の 3. 私は結果があると思います 1.0. この結果は、適切ではありません, 答えが範囲内であるべきです 1.0 と 3/1.0 = 2.0. 要した平均時間 1 結果として、我々が持っています 1.5. で再試行してください 1.5 と 3/1.5 = 2.0 結果として、我々が持っています 1.75! 多くの反復の後に我々は漸近の結果は答える必要があります!

テオ光景! エンジニアは笑って続けました.

私たちは、正確な結果を持っていないので, 反復回数が無限になる必要があります. しかし、各繰り返しで, まだ十分に正確で、必要に応じて、私は結果を確認しようとします. 例えば、現在の答えは、xがある場合= 1.73, X2 = 2.99 そして私達はちょうど精度 2 カンマの後の数, その後 1.73 適切な答えは. だから我々は、平方根を計算するプログラムを持っています 2 次のように:

#include<math.h>
#include<stdio.h>

#define PRECISE 0.0001f

double mysqrt(int x)
{
    double guess = (double)x / 2;
    while (fabs(guess*guess - x)/x >= PRECISE)
        guess = (x/guess - guess) / 2 + guess;
    return guess;
}

int main(void)
{
    int x;
    printf("Input x: ");
    scanf("%d", &x);
    printf("Sqrt of %d = %fn", x, mysqrt(x));
    return 0;
}

入力x: 3
のSQRT 3 = 1.732051

そして、悟りを開いたテオ!

ソース: ktmt.github.io/blog