2014-02-16 7 views
2

Java에서 float의 지수를 증가 시키려고합니다 (가수를 건드리지 않음).부동 소수점 지수 증가

Math.getExponent()으로 지수를 검색하고 증가시키는 방법을 알고 있지만 비트 조작을 사용하여 float의 원래 지수를 대체하는 방법을 잘 모릅니다.

자바가 getExponent() 또는 유사하게 제공되는 것을 좋아하지 않습니다.

음수 및 양수 지수 범위에서 올바르게 증가해야합니다.

+0

음수 지수에 대한 메모는 약간 이상합니다. 지수가 바이어스 127을 사용하여 표현된다는 것을 알고 계십니까? –

+0

@MartijnCourteaux : 지수의 인코딩은 바이어스를 사용합니다. 질문은 인코딩이 아니라 실제 지수를 나타냅니다. 예를 들어,'Math.getExponent' 함수는 실제 지수 값을 반환합니다. 바이어스로 인코딩 된 음의 지수를 참조하는 것이 더 이상하지 않습니다. 2의 보수로 인코딩 된 음의 정수를 나타내는 것입니다. –

답변

6

지수가 2의 거듭 제곱을 나타 내기 때문에 숫자에 2를 곱하면됩니다. 지수가 증가해야합니다 (숫자가 곱하기 전과 후에 표준화되었다고 가정). 정규화는 대개 Java에서 자동으로 발생하므로 재미있는 작업을 수행하지 않는 한 걱정할 필요가 없습니다. 당신이 정말로 직접 비트를 조작하려면

, 당신은 앞뒤로 floatfloatint보기 사이의 변환 Float.floatToIntBitsFloat.intBitsToFloat를 사용할 수 있습니다.

+0

정규화 란 무엇을 의미합니까? 나는 매번 정확하게 증가하는 숫자와 반올림 문제가 없는지 확인하고 싶다. –

+0

젠장, 그건 영리했다. +1 –

+0

@DavidChouinard - 정규화는 가수의 첫 번째 비트 (또는 첫 번째 묵시적 비트)가 0이 아니도록합니다. Base-10 과학 표기법에서는 1.22 (정규화되지 않음)를 사용하여 120을 표현하는 것과 같습니다 (정규화되지 않음). 라운딩은 2를 곱하면 문제가되지 않습니다. –

4

정말 쉽습니다. 그것을 int로 변환하고 지수를 증가시키고 다시 변환하십시오. 여기

public static float increaseExponent(float f) 
{ 
    int bits = Float.floatToIntBits(f); 
    bits += 0x800000; 
    return Float.intBitsToFloat(bits); 
} 

데모 : http://ideone.com/vs8BrG

float f = (float) Math.PI; 
System.out.println(f); 
System.out.println(f * 2.0f); 
System.out.println(increaseExponent(f)); 

출력 :

3.1415927 
6.2831855 
6.2831855 

enter image description here

그런 다음,이 코드는 트릭을 수행해야합니다 부동의 레이아웃을 고려

관련 문제