2016-09-07 13 views
1

더 높은 정밀도 (80 비트)로 계산되고 즉시 잘린 (32 비트로) 단일 부동 소수점 연산 (a + b, ab, a * b 또는 a/b)은 원래 유형의 정밀도 (32 비트)?더 높은 정밀도로 계산되고 즉시 절단 된 단일 부동 소수점 연산은 항상 동일한 결과를 산출합니까?

결과에서 최하위 비트가 다를 수 있습니까? 왜?

편집 :

심지어 곱셈 불구하고 지침을 추가 64 비트 내부 정밀, 결과를 사용하는이 예제의 this blog post

float tmp; // 32 bit precision temporary variable 
push a;  // converts 32 to 64 bit 
push b;  // converts 32 to 64 bit 
multiply; // 64 bit computation 
pop tmp; // converts result to 32 bits 

저자의 예제의 일부는 다음과 같이이 코드는 설명 32 비트 형식으로 즉시 변환되므로 결과에 영향을주지 않습니다.

그래서 내가 묻는 것은 항상 사실입니까? 이와 같은 단일 연산은 플랫폼에 관계없이 항상 마지막 비트와 동일한 결과를 생성합니다.

저는 C#으로 프로그래밍 중이며, 여기서는 정밀도 부동 소수점 연산이 수행되는 것을 제어하지 않습니다. C# 1 규격에서

:

부동 소수점 연산은 연산 결과 형보다 정밀하게 수행 될 수있다. 예를 들어, 일부 하드웨어 아키텍처는 이중 유형보다 큰 범위와 정밀도를 가진 "확장"또는 "긴 이중"부동 소수점 유형을 지원하고, 암시이 높은 정밀 형을 사용하여 모든 부동 소수점 연산을 수행합니다.

부동 소수점에 대한 단일 연산 (아래의 C# 예와 같이)이 결정적인지 알아야합니다.

double a = 2.5d; 
double b = 0.1d; 
myClassInstance.someDoubleField = a*b; // value should be converted out of extended precision 

그래서 모든 플랫폼에서 동일하게 진행이 someDoubleField 가치인가?

+0

"0으로 반올림 됨"과 같이 잘 렸는가? 아니면 실제로 "가장 가까운 방향으로 반올림"으로 반올림하여 정밀도 감소를 언급하고 있습니까? 후자의 경우, 더 높은 정밀도가 최소 2n + k 비트와 낮은 n 비트 정밀도를 제공한다면 더하기/빼기, 곱하기, 나누기, 제곱근 및 역수 제곱근에 대해 동일한 결과를 얻을 수 있음을 게시 된 작업에서 확인할 수 있습니다 여기서 k <= 3)는 IEEE-754 배정도에서 연산을 수행하고 올바르게 반올림 한 결과를 IEEE-754 단 정밀도로 반올림하여 조건이 충족됨을 의미합니다. 나는 참고 문헌이 없다. – njuffa

+0

값이 확장 된 정밀도에서 벗어 났을 때 잘립니다. 추가 설명으로 질문을 업데이트했습니다. – zigzag

+0

여기에 묻고있는 것이 명확하지 않습니다. 당신. 주어진 작업 시퀀스를 무엇과 비교하고 있습니까? – EJP

답변

2

예, 그것은이 논문에서 설립 된 것 :

사무엘 A. 피규어, "때를 두 번 라운딩 무해?" ACM SIGNUM 뉴스 권 30 호 3 7 월 1995 도이 : 10.1145/221332.221334

주 결과 인 그 입력 타입 P 비트의 significands 및 계산의 유효수 비트들의 수를 갖는 경우 타입이 적어도 2 p +2 비트이면 기본 작업 +, -, *, /sqrt은 잘린 경우 올바르게 반올림됩니다.이 53 비트의 유효 숫자를 갖는 binary64 (즉 전형적인 C double)를 사용하기에 충분한 사실 그래서

IEEE754 binary32 숫자 (즉, 일반적인 C float 타입), 24 비트의 유효 숫자를 갖는다. 실제로 언어 자체가 binary64 유형 인 경우 binary32 작업을 사용하는 것은 매우 일반적인 속임수입니다 (used by JavaScript compilers).

+0

njuffa가 추가 설명을 요청할 때 추가 설명으로 질문을 업데이트했습니다. 내가 의미했던 것. 그래서 물어볼 수 있다면 기본 동작이 80 비트 확장 정밀도를 사용하는 두 개의 64 비트 이중에서 수행 될 때도 동일합니까? – zigzag

+1

@zigzag 정밀도 요구 사항의 "2p + 2"비트에 유의하십시오 (역수승근을 포함하는 경우 2p + 3). 80 비트 확장 된 정밀도 (64 비트 유효 숫자/가수)를 배의 정밀도로 반올림하는 것을 고려할 때 분명히 만족스럽지 않습니다. – njuffa

+2

아니요 (x87 80 비트 "long double"에는 64 비트 유효 숫자가 있으므로 속성이 만족되지 않습니다). 컴파일러 옵션을 사용해야 할 수도 있습니다. C#에는'/ fp : precise'가 있습니다. https://msdn.microsoft.com/en-us/library/e7s85ffb.aspx –