문제

이상의 수치 분석 보다는 오히려 프로그래밍 질문,하지만 난 당신의 일부에 응답할 수 있을 것이다.

합계에서 두 개의 수레가 없는 정밀도 분실?왜?

에 합의 플로트와의 정수,가 없는 정밀도 분실?왜?

감사합니다.

도움이 되었습니까?

해결책

합계 두 플로트에서 정밀도가 손실 되었습니까?

두 플로트가 크기가 다르고 둘 다 완전한 정밀 범위 (약 7 자리)를 사용하는 경우 마지막 장소에서 약간의 손실이 나타납니다.

왜요?

플로트는 (사인) (Mantissa) × 2의 형태로 저장되기 때문입니다.(멱지수). 두 값이 지수가 다르고 추가하면 더 큰 값이 Mantissa의 숫자가 적은 숫자로 줄어 듭니다 (더 큰 지수에 적응해야하기 때문에).

PS> [float]([float]0.0000001 + [float]1)
1

플로트와 정수의 합으로, 정밀도가 손실 되었습니까?

예, 정상적인 32 비트 정수는 플로트에 정확히 맞지 않는 값을 정확하게 표현할 수 있습니다. 플로트는 여전히 저장할 수 있습니다 같은 숫자이지만 더 이상 정확하지 않습니다. 물론 이것은 충분히 큰 숫자에만 적용됩니다. i. 이자형. 24 비트 이상.

왜요?

Float는 24 비트의 정밀도를 가지고 있고 (32 비트) 정수는 32를 가지고 있기 때문에 Float는 여전히 크기와 대부분의 중요한 숫자를 유지할 수 있지만 마지막 장소는 다를 수 있습니다.

PS> [float]2100000050 + [float]100
2100000100

다른 팁

정밀도에 따라 달라의 크기를 원래의 숫자입니다.부동 소수점,컴퓨터의 수를 나타냅 312 내부적으로 과학적인 표기:

3.12000000000 * 10 ^ 2

소수 자릿수에서 왼쪽(가수)은 고정되어 있습니다.지도 상단 및 하단니다.이것은 그것을 나타내는 매우 작거나 매우 큰 숫자입니다.

에 추가하려고 하면 두 개의 숫자에서 같은 크기 결과 동일하게 유지해야에서는 정밀기 때문에 소수점 이동하지 않:

312.0 + 643.0 <==>

3.12000000000 * 10 ^ 2 +
6.43000000000 * 10 ^ 2
-----------------------
9.55000000000 * 10 ^ 2

를 추가하려는 경우 매우 크고 매우 작은 수,당신은 잃을 것이기 때문에 그들은 정밀도 것으로 압착 위 형식입니다.고려 312+12300000000000000000000.첫째로 당신은 규모가 작은 숫자를 라인으로 더 큰 중 하나,다음을 추가합니다:

1.23000000000 * 10 ^ 15 +
0.00000000003 * 10 ^ 15
-----------------------
1.23000000003 <-- precision lost here!

유동점 처리할 수 있는 매우 크고,또는 아주 작은 숫자입니다.하지만 그것을 할 수 없습을 나타내 모두에서 동일한 시간입니다.

으로 수을 두 배로 추가되고,int 얻으로 즉시,그 위에 적용됩니다.

두 개의 부동 소수점 번호를 추가하면 일반적으로 약간의 오류가 있습니다. D. Goldberg 's "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것" 효과와 이유를 자세히 설명하고 오류에 대한 상한을 계산하는 방법과보다 복잡한 계산의 정밀도에 대한 추론 방법을 설명합니다.

정수에 플로트를 추가 할 때 정수는 먼저 C ++에 의해 플로트로 변환되므로 두 개의 플로트가 추가되고 오류가 위와 같은 이유로 도입됩니다.

a float 제한적이므로 물론 주어진 작업이 정밀도를 떨어 뜨릴 위험이 항상 있습니다.

두 질문 모두에 대한 답은 "예"입니다.

매우 작은 플로트에 매우 작은 플로트를 추가하려고하면 예를 들어 문제가 있습니다.

또는 정수를 플로트에 추가하려고하면 정수가 Mantissa에서 사용할 수있는 플로트보다 더 많은 비트를 사용합니다.

짧은 대답:컴퓨터 대표 부동의 수를 제한 비트,자주 수행 가수와 지수, 그래서만 몇 바이트 사용에 대한 뜻깊은 자리,그리고 다른 사람들을 나타내는 데 사용되는 소수점의 위치.

는 경우에 당신을 추가하려고 하는(말)10^23 7,다음 그것을 할 수 없을 정확하게 나타내는 결과이다.비슷한 인수 때 적용되며 추가 플로트 및 정수-정수로 승격되고 있습니다.

합계 두 플로트에서 정밀도가 손실 되었습니까? 플로트와 정수의 합으로, 정밀도가 손실 되었습니까? 왜요?

항상 그런 것은 아닙니다. 합계가 당신이 요구하는 정밀도로 표현 될 수 있고 당신은 정밀 손실을 얻지 못할 것입니다.

예 : 0.5 + 0.75 => 정밀 손실 없음 x * 0.5 => 정밀 손실 없음 (X가 너무 작은 경우 제외)

일반적으로 하나는 약간 다른 범위의 플로트를 추가하므로 실제로 반올림 모드에 의존하는 정밀 손실이 있습니다. IE : 완전히 다른 범위의 숫자를 추가하는 경우 정밀 문제를 예상하십시오.

CPU를 희생시키면서 극단적 인 경우에 외계를 제공하기 위해 거절이 여기에 있습니다.

컴파일러가 부동산 계산을 처리하는 방법에 따라 결과가 다를 수 있습니다.

엄격한 IEEE 시맨틱을 사용하면 2 개의 32 비트 플로트를 추가하면 32 비트보다 더 나은 정확도를 제공해서는 안됩니다. 실제로는 더 많은 지시가 필요할 수 있으므로 플로팅 포인트로 정확하고 반복 가능한 결과에 의존해서는 안됩니다.

두 경우 모두 예 :

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );

Case Float + Int는 표준 변환이 int에 적용되기 때문에 Float + Float와 동일합니다. float + float의 경우 구현이 이중 정밀도로 추가를 선택할 수 있기 때문에 구현 종속입니다. 물론 결과를 저장할 때 약간의 손실이있을 수 있습니다.

두 경우 모두 대답은 "예"입니다. 추가 할 때 int a float, 정수는 어쨌든 추가가 발생하기 전에 부동 소수점 표현으로 변환됩니다.

이유를 이해하려면이 보석을 읽는 것이 좋습니다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top