문제

정수의 가장 정확한 제곱근을 찾기 위해 자신만의 기능을 어떻게 작성합니까?

인터넷 검색 후, 나는 찾았다 이것 (그것으로부터 보관 된 원본 링크), 그러나 먼저, 나는 그것을 완전히 얻지 못했고, 둘째, 그것은 대략적입니다.

가장 가까운 정수 (실제 루트에) 또는 플로트로 제곱근을 가정하십시오.

도움이 되었습니까?

해결책

다음은 n> 0에 대한 바닥 (sqrt (n))를 계산합니다.

x = 2^ceil(numbits(N)/2)
loop:
    y = floor((x + floor(N/x))/2)
    if y >= x
        return x
    x = y

이것은 Crandall & Pomerance, "소수 : 계산 관점"에 제공된 Newton의 방법의 버전입니다. 이 버전을 사용해야하는 이유는 자신이하고있는 일을 아는 사람들이 그것이 제곱근의 바닥으로 정확히 수렴한다는 것을 증명했으며, 구현 오류를 만들 가능성이 작기 때문에 간단합니다. 또한 빠른 알고리즘을 구축 할 수는 있지만 올바르게하는 것이 훨씬 더 복잡합니다). 적절하게 구현 된 이진 검색은 매우 작은 N의 경우 더 빠를 수 있지만 조회 테이블을 사용할 수도 있습니다.

둥글게 가장 가까운 정수, 위의 알고리즘을 사용하여 T = Floor (SQRT (4N))를 계산합니다. 가장 유의미한 비트가 설정된 경우 x = (t+1)/2를 선택하십시오. 그렇지 않으면 t/2를 선택하십시오. 이것은 넥타이로 반올림합니다. 나머지가 0이 아닌지 (즉, t^2 == 4N)를 살펴보면 둥글거나 둥글게 둥글게 할 수도 있습니다.

부동 소수점 산술을 사용할 필요가 없습니다. 사실, 당신은해서는 안됩니다. 이 알고리즘은 정수를 사용하여 완전히 구현되어야합니다 (특히 Floor () 함수는 일반 정수 부서를 사용해야 함을 나타냅니다).

다른 팁

귀하의 요구에 따라 간단한 분열 및 대체 전략을 사용할 수 있습니다. 그것은 AS로 수렴하지 않습니다 빠른 다른 방법 으로서는 초보자가 이해하기가 훨씬 쉬울 수 있습니다. 또한, O (로그 N) 알고리즘 (각 반복 각각 검색 공간 절반)이므로 32 비트 플로트의 최악의 경우는 32 회 반복됩니다.

62.104의 제곱근을 원한다고 가정 해 봅시다. 당신은 0 사이의 반쯤 값을 선택하고 그것을 제곱합니다. 정사각형이 숫자보다 높으면 중간 점보다 적은 숫자에 집중해야합니다. 너무 낮다면 더 높은 사람들에게 집중하십시오.

실제 수학을 사용하면 검색 공간을 영원히 영원히 나눌 수 있습니다 (합리적인 제곱근이없는 경우). 실제로, 컴퓨터는 결국 정밀도가 떨어지고 근사치를 가질 것입니다. 다음 C 프로그램은 요점을 보여줍니다.

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
    float val, low, high, mid, oldmid, midsqr;
    int step = 0;

    // Get argument, force to non-negative.

    if (argc < 2) {
        printf ("Usage: sqrt <number>\n");
        return 1;
    }
    val = fabs (atof (argv[1]));

    // Set initial bounds and print heading.

    low = 0;
    high = mid = val;
    oldmid = -1;

    printf ("%4s  %10s  %10s  %10s  %10s  %10s    %s\n",
        "Step", "Number", "Low", "High", "Mid", "Square", "Result");

    // Keep going until accurate enough.

    while (fabs(oldmid - mid) >= 0.00001) {
        oldmid = mid;

        // Get midpoint and see if we need lower or higher.

        mid = (high + low) / 2;
        midsqr = mid * mid;
        printf ("%4d  %10.4f  %10.4f  %10.4f  %10.4f  %10.4f  ",
            ++step, val, low, high, mid, midsqr);
        if (mid * mid > val) {
            high = mid;
            printf ("- too high\n");
        } else {
            low = mid;
            printf ("- too low\n");
        }
    }

    // Desired accuracy reached, print it.

    printf ("sqrt(%.4f) = %.4f\n", val, mid);
    return 0;
}

몇 가지 실행이 있으므로 어떻게 작동하는지 알기를 바랍니다. 77 :

pax> sqrt 77
Step      Number         Low        High         Mid      Square    Result
   1     77.0000      0.0000     77.0000     38.5000   1482.2500  - too high
   2     77.0000      0.0000     38.5000     19.2500    370.5625  - too high
   3     77.0000      0.0000     19.2500      9.6250     92.6406  - too high
   4     77.0000      0.0000      9.6250      4.8125     23.1602  - too low
   5     77.0000      4.8125      9.6250      7.2188     52.1104  - too low
   6     77.0000      7.2188      9.6250      8.4219     70.9280  - too low
   7     77.0000      8.4219      9.6250      9.0234     81.4224  - too high
   8     77.0000      8.4219      9.0234      8.7227     76.0847  - too low
   9     77.0000      8.7227      9.0234      8.8730     78.7310  - too high
  10     77.0000      8.7227      8.8730      8.7979     77.4022  - too high
  11     77.0000      8.7227      8.7979      8.7603     76.7421  - too low
  12     77.0000      8.7603      8.7979      8.7791     77.0718  - too high
  13     77.0000      8.7603      8.7791      8.7697     76.9068  - too low
  14     77.0000      8.7697      8.7791      8.7744     76.9893  - too low
  15     77.0000      8.7744      8.7791      8.7767     77.0305  - too high
  16     77.0000      8.7744      8.7767      8.7755     77.0099  - too high
  17     77.0000      8.7744      8.7755      8.7749     76.9996  - too low
  18     77.0000      8.7749      8.7755      8.7752     77.0047  - too high
  19     77.0000      8.7749      8.7752      8.7751     77.0022  - too high
  20     77.0000      8.7749      8.7751      8.7750     77.0009  - too high
  21     77.0000      8.7749      8.7750      8.7750     77.0002  - too high
  22     77.0000      8.7749      8.7750      8.7750     76.9999  - too low
  23     77.0000      8.7750      8.7750      8.7750     77.0000  - too low
sqrt(77.0000) = 8.7750

62.104의 경우 :

pax> sqrt 62.104
Step      Number         Low        High         Mid      Square    Result
   1     62.1040      0.0000     62.1040     31.0520    964.2267  - too high
   2     62.1040      0.0000     31.0520     15.5260    241.0567  - too high
   3     62.1040      0.0000     15.5260      7.7630     60.2642  - too low
   4     62.1040      7.7630     15.5260     11.6445    135.5944  - too high
   5     62.1040      7.7630     11.6445      9.7037     94.1628  - too high
   6     62.1040      7.7630      9.7037      8.7334     76.2718  - too high
   7     62.1040      7.7630      8.7334      8.2482     68.0326  - too high
   8     62.1040      7.7630      8.2482      8.0056     64.0895  - too high
   9     62.1040      7.7630      8.0056      7.8843     62.1621  - too high
  10     62.1040      7.7630      7.8843      7.8236     61.2095  - too low
  11     62.1040      7.8236      7.8843      7.8540     61.6849  - too low
  12     62.1040      7.8540      7.8843      7.8691     61.9233  - too low
  13     62.1040      7.8691      7.8843      7.8767     62.0426  - too low
  14     62.1040      7.8767      7.8843      7.8805     62.1024  - too low
  15     62.1040      7.8805      7.8843      7.8824     62.1323  - too high
  16     62.1040      7.8805      7.8824      7.8815     62.1173  - too high
  17     62.1040      7.8805      7.8815      7.8810     62.1098  - too high
  18     62.1040      7.8805      7.8810      7.8807     62.1061  - too high
  19     62.1040      7.8805      7.8807      7.8806     62.1042  - too high
  20     62.1040      7.8805      7.8806      7.8806     62.1033  - too low
  21     62.1040      7.8806      7.8806      7.8806     62.1038  - too low
  22     62.1040      7.8806      7.8806      7.8806     62.1040  - too high
  23     62.1040      7.8806      7.8806      7.8806     62.1039  - too high
sqrt(62.1040) = 7.8806

49 :

pax> sqrt 49
Step      Number         Low        High         Mid      Square    Result
   1     49.0000      0.0000     49.0000     24.5000    600.2500  - too high
   2     49.0000      0.0000     24.5000     12.2500    150.0625  - too high
   3     49.0000      0.0000     12.2500      6.1250     37.5156  - too low
   4     49.0000      6.1250     12.2500      9.1875     84.4102  - too high
   5     49.0000      6.1250      9.1875      7.6562     58.6182  - too high
   6     49.0000      6.1250      7.6562      6.8906     47.4807  - too low
   7     49.0000      6.8906      7.6562      7.2734     52.9029  - too high
   8     49.0000      6.8906      7.2734      7.0820     50.1552  - too high
   9     49.0000      6.8906      7.0820      6.9863     48.8088  - too low
  10     49.0000      6.9863      7.0820      7.0342     49.4797  - too high
  11     49.0000      6.9863      7.0342      7.0103     49.1437  - too high
  12     49.0000      6.9863      7.0103      6.9983     48.9761  - too low
  13     49.0000      6.9983      7.0103      7.0043     49.0598  - too high
  14     49.0000      6.9983      7.0043      7.0013     49.0179  - too high
  15     49.0000      6.9983      7.0013      6.9998     48.9970  - too low
  16     49.0000      6.9998      7.0013      7.0005     49.0075  - too high
  17     49.0000      6.9998      7.0005      7.0002     49.0022  - too high
  18     49.0000      6.9998      7.0002      7.0000     48.9996  - too low
  19     49.0000      7.0000      7.0002      7.0001     49.0009  - too high
  20     49.0000      7.0000      7.0001      7.0000     49.0003  - too high
  21     49.0000      7.0000      7.0000      7.0000     49.0000  - too low
  22     49.0000      7.0000      7.0000      7.0000     49.0001  - too high
  23     49.0000      7.0000      7.0000      7.0000     49.0000  - too high
sqrt(49.0000) = 7.0000

x의 제곱근을 계산하는 간단한 (하지만 빠르지 않은) 방법 :

squareroot(x)
    if x<0 then Error
    a = 1
    b = x
    while (abs(a-b)>ErrorMargin) 
        a = (a+b)/2
        b = x/a
    endwhile
    return a;

예 : Squareroot (70000)

    a       b
    1   70000
35001       2
17502       4
 8753       8
 4381      16
 2199      32
 1116      63
  590     119
  355     197
  276     254
  265     264

보시다시피, 제곱근의 상단과 하한 경계를 정의하고 크기가 허용 될 때까지 경계를 좁 힙니다.

보다 효율적인 방법이 있지만이 방법은 프로세스를 보여주고 이해하기 쉽습니다.

정수를 사용하는 경우 errormargin을 1로 설정하면 끝없는 루프가 있습니다.

게임 디자인의 세계에서 전설 인 역전이 빠르기 때문에 역 제곱근 1/sqrt (x)를 계산하는 매우 흥미로운 방법을 지적하겠습니다. 또는 기다려, 다음 게시물을 읽으십시오.

http://betterexplained.com/articles/understanding-quakes-fast inverse-square-root/

추신 : 나는 당신이 제곱근을 원하지만 지진의 우아함은 내 모든 저항을 극복했습니다. :)

그건 그렇고, 위에서 언급 한 기사는 어딘가에 지루한 Newton-Raphson 근사에 대해 이야기합니다.

물론 그것은 대략적입니다. 그것이 부동 소수점 수의 수학이 작동하는 방식입니다.

어쨌든 표준 방식은 다음과 같습니다 뉴턴의 방법. 이것은 Taylor의 시리즈를 사용하는 것과 거의 같습니다.

파이썬에서 임의의 정밀도로 제곱근을 계산하십시오

#!/usr/bin/env python
import decimal

def sqrt(n):
    assert n > 0
    with decimal.localcontext() as ctx:
        ctx.prec += 2 # increase precision to minimize round off error
        x, prior = decimal.Decimal(n), None
        while x != prior: 
            prior = x
            x = (x + n/x) / 2 # quadratic convergence 
    return +x # round in a global context


decimal.getcontext().prec = 80 # desirable precision
r = sqrt(12345)
print r
print r == decimal.Decimal(12345).sqrt()

산출:

111.10805551354051124500443874307524148991137745969772997648567316178259031751676
True

Facebook 등의 일반적인 인터뷰 질문입니다. 인터뷰에서 Newton의 방법을 사용하는 것이 좋은 생각이라고 생각하지 않습니다. 면접관이 실제로 이해하지 못할 때 뉴턴 방법의 메커니즘을 물으면 어떻게해야합니까?

나는 모든 사람들이 이해할 수 있다고 생각하는 Java에서 이진 검색 기반 솔루션을 제공했습니다.

public int sqrt(int x) {

    if(x < 0) return -1;
    if(x == 0 || x == 1) return x;

    int lowerbound = 1;
    int upperbound = x;
    int root = lowerbound + (upperbound - lowerbound)/2;

    while(root > x/root || root+1 <= x/(root+1)){
        if(root > x/root){
            upperbound = root;
        } else {
            lowerbound = root;
        }
        root = lowerbound + (upperbound - lowerbound)/2;
    }
    return root;
}

여기에서 내 코드를 테스트 할 수 있습니다. leetcode : sqrt (x)

에 관한 훌륭한 기사를 찾았습니다 정수 광장 뿌리.

이것은 약간 개선 된 버전입니다.

unsigned long sqrt(unsigned long a){
    int i;
    unsigned long rem = 0;
    unsigned long root = 0;
    for (i = 0; i < 16; i++){
        root <<= 1;
        rem = (rem << 2) | (a >> 30);
        a <<= 2;
        if(root < rem){
            root++;
            rem -= root;
            root++;
        }
    }
    return root >> 1;
}

Trigonometry를 사용하여 제곱근을 얻는 방법은 다음과 같습니다. 장거리에 의해 가장 빠른 알고리즘은 아니지만 정확합니다. 코드는 JavaScript입니다.

var n = 5; //number to get the square root of
var icr = ((n+1)/2); //intersecting circle radius
var sqrt = Math.cos(Math.asin((icr-1)/icr))*icr; //square root of n
alert(sqrt);

정확한 정사각형 뿌리를 계산하는 데 사용할 수있는 학교에서 공부 한 알고리즘이 있습니다 (또는 뿌리가 비이성적 인 숫자 인 경우 임의로 큰 정밀도). 뉴턴의 알고리즘보다 확실히 느리지 만 정확합니다. 531.3025의 제곱근을 계산하고 싶다고 가정 해 봅시다.

첫 번째는 소수점에서 시작하는 숫자를 소수점에서 2 자리의 그룹으로 나누는 것입니다.
{5}{31}.{30}{25}
그 다음에:
1) 첫 번째 그룹의 실제 제곱근과 작거나 동일한 첫 번째 그룹의 가장 가까운 제곱근을 찾으십시오 : SQRT ({5})> = 2. 우리가 이미 마지막 제곱근에서 찾은 숫자를 B로 표시하겠습니다. 그래서 현재 B = 2.
2) 다음으로 {5}와 b^2 : 5-4 = 1의 차이를 계산합니다.
3) 모든 후속 2 자리 그룹의 경우 다음을 수행합니다.
나머지를 100을 곱한 다음 두 번째 그룹에 추가하십시오 : 100 + 31 = 131.
131> = ((b*20) + x)*x가되도록 x- 뿌리의 다음 숫자를 찾으십시오. x = 3. 43 * 3 = 129 <131. 이제 B = 23. 또한 소수점의 왼쪽에 2 자리 그룹이 없기 때문에 최종 루트의 모든 정수 숫자를 찾았습니다.
4) {30} 및 {25}에 대해 동일하게 반복하십시오. 그래서 당신은 다음과 같습니다.
{30} : 131-129 = 2. 2 * 100 + 30 = 230> = (23 * 2 * 10 + x) * x-> x = 0-> b = 23.0
{25} : 230-0 = 230. 230 * 100 + 25 = 23025> = (230 * 2 * 10 + x) * x-> x = 5-> b = 23.05
최종 결과 = 23.05.
알고리즘은 이런 식으로 복잡해 보이지만 학교에서 공부 한 "긴 분할"에 사용하는 것과 동일한 표기법을 사용하여 종이로 수행하는 경우 훨씬 간단합니다.

첫 번째는 내 마음에 오는 것입니다.이 바이너리 검색을 사용하기에 좋은 곳입니다 (이 위대한에서 영감을 얻었습니다. 튜토리얼.)

의 제곱근을 찾으려면 vaule , 우리는 검색하고 있습니다 number 안에 (1..value) 예측 변수가 처음으로 사실입니다. 우리가 선택하는 예측자는입니다 number * number - value > 0.00001.

double square_root_of(double value)
{
     assert(value >= 1);
     double lo = 1.0;
     double hi = value;

     while( hi - lo > 0.00001)
     {
          double mid = lo + (hi - lo) / 2 ;
          std::cout << lo << "," << hi << "," << mid << std::endl;
          if( mid * mid - value > 0.00001)    //this is the predictors we are using 
          {
              hi = mid;
          } else {
              lo = mid;
          }

     }

    return lo;
 }
// Fastest way I found, an (extreme) C# unrolled version of:
// http://www.hackersdelight.org/hdcodetxt/isqrt.c.txt         (isqrt4)

// It's quite a lot of code, basically a binary search (the "if" statements)
// followed by an unrolled loop (the labels).
// Most important: it's fast, twice as fast as "Math.Sqrt".
// On my pc: Math.Sqrt ~35 ns, sqrt <16 ns (mean <14 ns)

private static uint sqrt(uint x)
{
    uint y, z;
    if (x < 1u << 16)
    {
        if (x < 1u << 08)
        {
            if (x < 1u << 04) return x < 1u << 02 ? x + 3u >> 2 : x + 15u >> 3;
            else
            {
                if (x < 1u << 06)
                { y = 1u << 03; x -= 1u << 04; if (x >= 5u << 02) { x -= 5u << 02; y |= 1u << 02; } goto L0; }
                else
                { y = 1u << 05; x -= 1u << 06; if (x >= 5u << 04) { x -= 5u << 04; y |= 1u << 04; } goto L1; }
            }
        }
        else                                             // slower (on my pc): .... y = 3u << 04; } goto L1; }
        {
            if (x < 1u << 12)
            {
                if (x < 1u << 10)
                { y = 1u << 07; x -= 1u << 08; if (x >= 5u << 06) { x -= 5u << 06; y |= 1u << 06; } goto L2; }
                else
                { y = 1u << 09; x -= 1u << 10; if (x >= 5u << 08) { x -= 5u << 08; y |= 1u << 08; } goto L3; }
            }
            else
            {
                if (x < 1u << 14)
                { y = 1u << 11; x -= 1u << 12; if (x >= 5u << 10) { x -= 5u << 10; y |= 1u << 10; } goto L4; }
                else
                { y = 1u << 13; x -= 1u << 14; if (x >= 5u << 12) { x -= 5u << 12; y |= 1u << 12; } goto L5; }
            }
        }
    }
    else
    {
        if (x < 1u << 24)
        {
            if (x < 1u << 20)
            {
                if (x < 1u << 18)
                { y = 1u << 15; x -= 1u << 16; if (x >= 5u << 14) { x -= 5u << 14; y |= 1u << 14; } goto L6; }
                else
                { y = 1u << 17; x -= 1u << 18; if (x >= 5u << 16) { x -= 5u << 16; y |= 1u << 16; } goto L7; }
            }
            else
            {
                if (x < 1u << 22)
                { y = 1u << 19; x -= 1u << 20; if (x >= 5u << 18) { x -= 5u << 18; y |= 1u << 18; } goto L8; }
                else
                { y = 1u << 21; x -= 1u << 22; if (x >= 5u << 20) { x -= 5u << 20; y |= 1u << 20; } goto L9; }
            }
        }
        else
        {
            if (x < 1u << 28)
            {
                if (x < 1u << 26)
                { y = 1u << 23; x -= 1u << 24; if (x >= 5u << 22) { x -= 5u << 22; y |= 1u << 22; } goto La; }
                else
                { y = 1u << 25; x -= 1u << 26; if (x >= 5u << 24) { x -= 5u << 24; y |= 1u << 24; } goto Lb; }
            }
            else
            {
                if (x < 1u << 30)
                { y = 1u << 27; x -= 1u << 28; if (x >= 5u << 26) { x -= 5u << 26; y |= 1u << 26; } goto Lc; }
                else
                { y = 1u << 29; x -= 1u << 30; if (x >= 5u << 28) { x -= 5u << 28; y |= 1u << 28; } }
            }
        }
    }
    z = y | 1u << 26; y /= 2; if (x >= z) { x -= z; y |= 1u << 26; }
Lc: z = y | 1u << 24; y /= 2; if (x >= z) { x -= z; y |= 1u << 24; }
Lb: z = y | 1u << 22; y /= 2; if (x >= z) { x -= z; y |= 1u << 22; }
La: z = y | 1u << 20; y /= 2; if (x >= z) { x -= z; y |= 1u << 20; }
L9: z = y | 1u << 18; y /= 2; if (x >= z) { x -= z; y |= 1u << 18; }
L8: z = y | 1u << 16; y /= 2; if (x >= z) { x -= z; y |= 1u << 16; }
L7: z = y | 1u << 14; y /= 2; if (x >= z) { x -= z; y |= 1u << 14; }
L6: z = y | 1u << 12; y /= 2; if (x >= z) { x -= z; y |= 1u << 12; }
L5: z = y | 1u << 10; y /= 2; if (x >= z) { x -= z; y |= 1u << 10; }
L4: z = y | 1u << 08; y /= 2; if (x >= z) { x -= z; y |= 1u << 08; }
L3: z = y | 1u << 06; y /= 2; if (x >= z) { x -= z; y |= 1u << 06; }
L2: z = y | 1u << 04; y /= 2; if (x >= z) { x -= z; y |= 1u << 04; }
L1: z = y | 1u << 02; y /= 2; if (x >= z) { x -= z; y |= 1u << 02; }
L0: return x > y ? y / 2 | 1u : y / 2;
}

이진 검색을 사용하십시오

public class FindSqrt {

    public static void main(String[] strings) {

        int num = 10000;
        System.out.println(sqrt(num, 0, num));
    }

    private static int sqrt(int num, int min, int max) {
        int middle = (min + max) / 2;
        int x = middle * middle;
        if (x == num) {
            return middle;
        } else if (x < num) {
            return sqrt(num, middle, max);
        } else {
            return sqrt(num, min, middle);
        }
    }
}

일반적으로 정수의 제곱근 (예 : 2 등)은 근사치 (부동 소수점 산술의 문제가 아니라 정확하게 계산할 수없는 비이성적 인 숫자 때문입니다).

물론 일부 근사치는 다른 근사보다 낫습니다. 물론 값 1.732는 1.7보다 3의 제곱근에 대한 더 나은 근사치라는 것을 의미합니다.

해당 링크에서 코드에서 사용한 방법은 첫 번째 근사치를 취하고이를 사용하여 더 나은 근사.

이것을 Newton의 방법이라고하며 각각의 새로운 근사치로 계산을 반복 할 수 있습니다. ~까지 당신에게 충분히 정확합니다.

사실 거기 ~ 해야 하다 반복을 막을시기를 결정하는 방법이 되십시오. 그렇지 않으면 영원히 실행됩니다.

일반적으로 근사치의 차이가 보다 적습니다 당신이 결정한 가치.

편집 : 나는 당신이 이미 찾은 두 가지보다 간단한 구현이있을 수 있다고 생각하지 않습니다.

이름이 말한 것처럼 반대는 "충분히" "충분히 가까이"입니다. 어쨌든 흥미로운 읽기.

Quake3의 빠른 invsqrt ()의 기원

이진 검색을 사용하여 Float Square 루트 및 임의의 정밀도를 처리 할 수있는 간단한 솔루션

루비로 코딩

include Math

def sqroot_precision num, precision
  upper   = num
  lower   = 0
  middle  = (upper + lower)/2.0

  while true do
    diff = middle**2 - num

    return middle if diff.abs <= precision

    if diff > 0
      upper = middle
    else diff < 0
      lower = middle
    end

    middle = (upper + lower)/2.0
  end 
end

puts sqroot_precision 232.3, 0.0000000001

우리가 2의 제곱근을 찾으려고 노력하고 있으며, 당신은 1.5의 추정치가 있다고 가정 해 봅시다. 우리는 a = 2, x = 1.5라고 말할 것입니다. 더 나은 추정치를 계산하기 위해 a를 x로 나눕니다. 이것은 새로운 값 y = 1.333333을 제공합니다. 그러나 우리는 이것을 다음 추정치로 받아 들일 수 없습니다 (왜 그렇지 않습니까?). 이전 추정치로 평균해야합니다. 따라서 다음 추정치 인 xx는 (x + y) / 2 또는 1.416666입니다.

Double squareRoot(Double a, Double epsilon) {
    Double x = 0d;
    Double y = a;
    Double xx = 0d;

    // Make sure both x and y != 0.
    while ((x != 0d || y != 0d) && y - x > epsilon) {
        xx = (x + y) / 2;

        if (xx * xx >= a) {
            y = xx;
        } else {
            x = xx;
        }
    }

    return xx;
}

Epsilon은 근사가 얼마나 정확한지를 결정합니다. 함수는 ABS (x*x -a) <Epsilon을 만족시키는 첫 번째 근사 X를 반환해야합니다. 여기서 ABS (x)는 x의 절대 값입니다.

square_root(2, 1e-6)
Output: 1.4142141342163086

글쎄, 이미 꽤 많은 답이 있지만 여기에 가장 간단한 코드 (나를 위해)가 있습니다. 여기에 있습니다. 연산 그것을 위해.

및 Python의 코드 2.7 :

from __future__ import division 
val = 81
x = 10
def sqr(data,x):
    temp = x - ( (x**2 - data)/(2*x))
    if temp == x:
        print temp
        return
    else:
        x = temp
        return sqr(data,x)
    #x =temp 
    #sqr(data,x)
sqr(val,x)

내장 기능의 도움으로 숫자의 제곱근을 계산하려면

# include"iostream.h"
# include"conio.h"
# include"math.h"
void main()
{
clrscr();
float x;
cout<<"Enter the Number";
cin>>x;

 float squreroot(float);  
 float z=squareroot(x);
 cout<<z;


float squareroot(int x)
    {


 float s;
 s = pow(x,.5)  
 return(s);
 }    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top