배정도 부동 소수점 (음수가 아닌) 숫자 x
이 주어지면 사각형의 제곱근은 항상 자신과 동일합니까? 광장은 무한대 또는 될 때x 제곱의 제곱근은 x와 같습니다.
x == z
나는이 사건에 관심이 아니에요 : 그래서를
x = <non-negative double>
y = x^2
z = sqrt(y)
: 즉
, 다음을 수행하면 정밀도의 손실이있다 0, 배정도에 맞는 숫자.
배정도 부동 소수점 (음수가 아닌) 숫자 x
이 주어지면 사각형의 제곱근은 항상 자신과 동일합니까? 광장은 무한대 또는 될 때x 제곱의 제곱근은 x와 같습니다.
x == z
나는이 사건에 관심이 아니에요 : 그래서를
x = <non-negative double>
y = x^2
z = sqrt(y)
: 즉
, 다음을 수행하면 정밀도의 손실이있다 0, 배정도에 맞는 숫자.
#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의 의견이 대체로 옳다는 인상을받습니다. x
과 x*x
이 모두 양수로 정규화 된 숫자 인 경우, 증명할만한 것은 아니지만 (약간의 작은 범위에 대해) x != sqrt(x*x)
의 빠른 무차별 대항력이있는 예제를 찾을 수 없습니다.
'x * x'가 언더 플로우 또는 오버플로하지 않으면 'sqrt (x * x) == x'가 https : //에서 공식적으로 증명되는 속성입니다. hal.inria.fr/hal-01148409/document –
@PascalCuoq 흥미로운 점은 내가해야 할 독서물이있는 것 같습니다. :) OP는 다른 질문에 언급 된 정규화되지 않은 숫자에 대한 제한을 언급하지 않았으므로 정확한 중복은 아니지만 다른 질문과 답변을 합하여이 질문에 대한 답을 얻었습니다. 여기에 나와있는 답변보다 훨씬 나은 답변이 있습니다. – hvd
숫자를 제곱하여 원래 값의 비트 수의 두 배 값을 생성합니다. 따라서 x가 너무 크면 x^2
과 x
에서 일부 비트가 손실되어 y
에서 완전히 복구 할 수 없습니다. [편집 : 올바른 반올림으로 x에서 y를 얻을 수 있습니다.] IEEE-754 배정 밀도의 경우, x
이 유효 부분에 26 비트를 초과하면 y
의 결과가 잘립니다. 그것은 가장 간단한 경우입니다.
x
몇 유효 숫자 비트하지만 매우 크거나 매우 작은 지수가있는 경우 다음 x^2
를 double 정밀도로 너무 큰 수 있습니다 및 x
를 복구 할 방법이없는 경우 inf
또는 비정규 숫자가 될 것이다. IEEE-754 표준이 필요하기 때문에 x
다음 sqrt(y)
가 x
와 같은 것 너무 크거나 너무 작없는 경우
+
, -
, *
, /
및 sqrt
는 제대로를 반올림합니다.
#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;
}
예제를 제공해 주시겠습니까? 이것은 내가 생각한 것입니다. 그러나 나는 그러한 숫자를 찾을 수 없었습니다. '812387342387487234.98132985798345 == sqrt (812387342387487234.98132985798345^2)' –
@ EcirHana 첫 번째 생각 : 너무 작기 때문에 그 사각형은 표현할 수없고 0이됩니다. – hvd
@hvd 예, 무한대와 0은 복구 할 수 없지만 다른 값은 어떨까요? 제발, 편집을 참조하십시오. –
'x> = 0', 맞습니까? – hvd
@hvd 네, 맞아요! –