2017-03-13 13 views
1

배정도 부동 소수점 (음수가 아닌) 숫자 x이 주어지면 사각형의 제곱근은 항상 자신과 동일합니까? 광장은 무한대 또는 될 때x 제곱의 제곱근은 x와 같습니다.

x == z 

나는이 사건에 관심이 아니에요 : 그래서를

x = <non-negative double> 
y = x^2 
z = sqrt(y) 

: 즉

, 다음을 수행하면 정밀도의 손실이있다 0, 배정도에 맞는 숫자.

+0

'x> = 0', 맞습니까? – hvd

+0

@hvd 네, 맞아요! –

답변

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

int main(void) { 
    double x = 1.0000000000000001E-160; 
    double square = x*x; 
    double root = sqrt(square); 
    if (root != x) { 
    printf("%.20g\n", x); 
    printf("%.20g\n", root); 
    } 
} 

출력

 
1.0000000000000001466e-160 
9.9999443357584897793e-161 

여기에서 일어나고있는 것은 x는 사각형으로 만 표현할 수 있음을의 사각 제로가 아닌 것으로 충분하지만, 충분히 작은 것입니다 사용 가능한 정밀도를 줄이는 비정규 숫자입니다.

나는 @ LưuVĩnhPhúc의 대답에 대한 @ MarkDickinson의 의견이 대체로 옳다는 인상을받습니다. xx*x이 모두 양수로 정규화 된 숫자 인 경우, 증명할만한 것은 아니지만 (약간의 작은 범위에 대해) x != sqrt(x*x)의 빠른 무차별 대항력이있는 예제를 찾을 수 없습니다.

+3

'x * x'가 언더 플로우 또는 오버플로하지 않으면 'sqrt (x * x) == x'가 https : //에서 공식적으로 증명되는 속성입니다. hal.inria.fr/hal-01148409/document –

+0

@PascalCuoq 흥미로운 점은 내가해야 할 독서물이있는 것 같습니다. :) OP는 다른 질문에 언급 된 정규화되지 않은 숫자에 대한 제한을 언급하지 않았으므로 정확한 중복은 아니지만 다른 질문과 답변을 합하여이 질문에 대한 답을 얻었습니다. 여기에 나와있는 답변보다 훨씬 나은 답변이 있습니다. – hvd

2

숫자를 제곱하여 원래 값의 비트 수의 두 배 값을 생성합니다. 따라서 x가 너무 크면 x^2x에서 일부 비트가 손실되어 y에서 완전히 복구 할 수 없습니다. [편집 : 올바른 반올림으로 x에서 y를 얻을 수 있습니다.] IEEE-754 배정 밀도의 경우, x이 유효 부분에 26 비트를 초과하면 y의 결과가 잘립니다. 그것은 가장 간단한 경우입니다.

x 몇 유효 숫자 비트하지만 매우 크거나 매우 작은 지수가있는 경우 다음 x^2를 double 정밀도로 너무 큰 수 있습니다 및 x를 복구 할 방법이없는 경우 inf 또는 비정규 숫자가 될 것이다. IEEE-754 표준이 필요하기 때문에 x 다음 sqrt(y)x와 같은 것 너무 크거나 너무 작없는 경우

+, -, *, /sqrt제대로를 반올림합니다.

Examples:

#include <iostream> 
#include <ios> 
#include <iomanip> 
#include <cmath> 

using std::fixed; 
using std::hexfloat; 
using std::cout; 

int main() { 
    double x = 1.25e155; 
    double y = x*x; 
    cout << hexfloat << "x = " << x << ", y = " << y << ", sqrt(y) = " << sqrt(y) << '\n'; 

    x = 1.25e-155; 
    y = x*x; 
    cout << hexfloat << "x = " << x << ", y = " << y << ", sqrt(y) = " << sqrt(y) << '\n'; 
    return 0; 
} 
+0

예제를 제공해 주시겠습니까? 이것은 내가 생각한 것입니다. 그러나 나는 그러한 숫자를 찾을 수 없었습니다. '812387342387487234.98132985798345 == sqrt (812387342387487234.98132985798345^2)' –

+0

@ EcirHana 첫 번째 생각 : 너무 작기 때문에 그 사각형은 표현할 수없고 0이됩니다. – hvd

+0

@hvd 예, 무한대와 0은 복구 할 수 없지만 다른 값은 어떨까요? 제발, 편집을 참조하십시오. –