2012-02-28 3 views

답변

4

그것은 기능이 꽤 사소한 것 같습니다; 이것은 vulkanino에 의해 연결 질문에 대한 허용 대답의 의사에 근거 : BitConverter 그 기능이 없기 때문에

double value = whatever; 
long bits = BitConverter.DoubleToInt64Bits(value); 
double nextValue = BitConverter.Int64BitsToDouble(bits + 1); 
double result = nextValue - value; 

수레를 들어, SingleToInt32BitsInt32BitsToSingle의 자신의 구현을 제공해야 할 것입니다.

This page은 함수의 Java 구현에서 특별한 경우를 보여줍니다. 그것들을 다루는 것은 상당히 사소한 것이어야한다.

1

phoog 대답은 좋지만 음수, max_double, 무한대 및 NaN의 약점이 있습니다.

phoog_ULP (양수 x) -> 양수입니다. 좋은.
phoog_ULP (음수 x) -> 음수입니다. 나는 긍정적 인 숫자를 기대할 것이다.

다음
long bits = BitConverter.DoubleToInt64Bits(value) & 0x7FFFFFFFFFFFFFFFL; 

이 ... 당신이 관심을 가져야 해상도를 필요 프린지 경우입니다

phoog_ULP (X = +/- Max_double 1.797 ... 전자 + 308) 반환 :
내가 대신 추천이 문제를 해결하려면 무한한 결과. (+1.996 ... e + 292)가 예상됩니다.
phoog_ULP (x = +/- Infinity) 결과는 NaN입니다. 무한대 예상.
phoog_ULP (x = +/- NaN)가 예기치 않게 sNan에서 qNaN으로 변경 될 수 있습니다. 변화는 기대되지 않습니다. 이 경우 기호가 +가되어야한다면 어느 쪽이든 주장 할 수 있습니다.

이러한 문제를 해결하기 위해 편의를 위해 "비트"값을 사용하여 이러한 문제를 해결할 수있는 brutish if() 테스트 만 볼 수 있습니다. 예 :

double ulpc(double value) { 
    long long bits = BitConverter::DoubleToInt64Bits(value); 
    if ((bits & 0x7FF0000000000000L) == 0x7FF0000000000000L) { // if x is not finite 
    if (bits & 0x000FFFFFFFFFFFFFL) { // if x is a NaN 
     return value; // I did not force the sign bit here with NaNs. 
     } 
    return BitConverter.Int64BitsToDouble(0x7FF0000000000000L); // Positive Infinity; 
    } 
    bits &= 0x7FFFFFFFFFFFFFFFL; // make positive 
    if (bits == 0x7FEFFFFFFFFFFFFL) { // if x == max_double (notice the _E_) 
    return BitConverter.Int64BitsToDouble(bits) - BitConverter.Int64BitsToDouble(bits - 1); 
    } 
    double nextValue = BitConverter.Int64BitsToDouble(bits + 1); 
    double result = nextValue - value; 
} 
관련 문제