2016-06-23 3 views
0

현재 학교에서 "새로운 언어"를 쓰고 있으며 수학 수업을 구현해야합니다.ULP 계산 부동 소수점

사양 중 하나는 Java의 Math.ulp()와 같이 ulp 메서드를 구현하는 것입니다. 우리는 플로트 타입을 연구하고 있습니다.

나는 많은 흥미로운 소스를 찾았지만 그때

normalized x

ulp equation

경우 .. 여전히

AFAIK 부동의 ULP을 계산할 수 아니에요

하지만 lib가없는 float에 대해 정규화 된 양식을 얻으려면 어떻게해야합니까? 그리고 매개 변수를 얻는 방법 e & n + 1?

는 당신의 도움을

안부,

답변

2

내가 자바 부동 소수점 수의 비트 패턴을 얻을 앨리어싱의 가능성 (가까운 충분한 대안이있다 모르겠어요 감사합니다 대답의 두 번째 부분이 표시됨), 그렇다면 e는 비트 23에서 30 (31은 부호)에서 일부 상수를 뺀 것입니다 (the wikipedia description of the format과 같이 숫자가 비정상적이지 않으면 127입니다). n은 고정되어 있습니다 이 경우 23 비트 또는 암시 적으로 포함 된 경우 24 임 1)

이 j를 수행하는 lib를 사용하는 것이 좋습니다 너를 위해 너의 ob.

또 다른 옵션은 float 비트를 int로 변환한다는 의미에서 (간접적으로) 주석에 포함되어 있습니다. 나는 직접 코드 스 니펫을 작성하겠습니다. Java에 정통하지는 않습니다 (floatToIntBits뿐만 아니라 intToFloatBits가 java.lang.Float 클래스의 정적 메서드이기 때문에 코드가 패키지/클래스 지정자가 없기 때문에 즉시 작동하지 않을 수 있습니다. 위의 제안과 다른 점은 조금 정통 그러나 당신이 질문 자체에 제시 한 코드보다 더 나은 성능을 가지고있다.

float ulp(float x) { 
    int repr; 
    float next; 
    if (Float.isNaN(x)) return Float.NaN; //special handling, to be safe 
    repr = Float.floatToIntBits(x); 
    x++; //will work correctly independently of sign 
    next = Float.intBitsToFloat(repr) 
    return next-x; 
} 
+0

https://docs.oracle.com/javase/7/docs/api/java/lang/Float.html# floatToIntBits (float) – Mysticial

+1

비트 : 부호 + 가수 + 지수 그리고 가수 ++은 같은 지수의 다음 부동 소수점 수를 제공합니다 –

+0

언어가 C 관련 일 경우 다른 대안이 있습니다 (@Mysticial의 주석은 실제로 이것을 허용합니다) –