더 높은 정밀도 (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으로 반올림 됨"과 같이 잘 렸는가? 아니면 실제로 "가장 가까운 방향으로 반올림"으로 반올림하여 정밀도 감소를 언급하고 있습니까? 후자의 경우, 더 높은 정밀도가 최소 2n + k 비트와 낮은 n 비트 정밀도를 제공한다면 더하기/빼기, 곱하기, 나누기, 제곱근 및 역수 제곱근에 대해 동일한 결과를 얻을 수 있음을 게시 된 작업에서 확인할 수 있습니다 여기서 k <= 3)는 IEEE-754 배정도에서 연산을 수행하고 올바르게 반올림 한 결과를 IEEE-754 단 정밀도로 반올림하여 조건이 충족됨을 의미합니다. 나는 참고 문헌이 없다. – njuffa
값이 확장 된 정밀도에서 벗어 났을 때 잘립니다. 추가 설명으로 질문을 업데이트했습니다. – zigzag
여기에 묻고있는 것이 명확하지 않습니다. 당신. 주어진 작업 시퀀스를 무엇과 비교하고 있습니까? – EJP