.NET에는 주어진 double 또는 float의 ULP을 계산하는 내장 메서드가 있습니까?두 배의 마지막 자리 (ULP)의 단위를 계산하십시오.
그렇지 않은 경우 가장 효율적인 방법은 무엇입니까?
.NET에는 주어진 double 또는 float의 ULP을 계산하는 내장 메서드가 있습니까?두 배의 마지막 자리 (ULP)의 단위를 계산하십시오.
그렇지 않은 경우 가장 효율적인 방법은 무엇입니까?
그것은 기능이 꽤 사소한 것 같습니다; 이것은 vulkanino에 의해 연결 질문에 대한 허용 대답의 의사에 근거 : BitConverter 그 기능이 없기 때문에
double value = whatever;
long bits = BitConverter.DoubleToInt64Bits(value);
double nextValue = BitConverter.Int64BitsToDouble(bits + 1);
double result = nextValue - value;
수레를 들어, SingleToInt32Bits
및 Int32BitsToSingle
의 자신의 구현을 제공해야 할 것입니다.
This page은 함수의 Java 구현에서 특별한 경우를 보여줍니다. 그것들을 다루는 것은 상당히 사소한 것이어야한다.
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;
}
행복 읽기 : http://stackoverflow.com/questions/1668183/find-min-max-of-a-float-double-that-has-the-same-internal-representation – vulkanino