我正在尋找在Java中增加浮點型指數(不接觸尾數)。僅增量浮點型指數
我知道如何檢索指數Math.getExponent()
並增加它,但我不確定如何使用位操作來替換浮點數的原始指數。
它不喜歡Java使可用getExponent()
或類似。
請注意,這必須在負指數範圍和正指數範圍內正確遞增。
我正在尋找在Java中增加浮點型指數(不接觸尾數)。僅增量浮點型指數
我知道如何檢索指數Math.getExponent()
並增加它,但我不確定如何使用位操作來替換浮點數的原始指數。
它不喜歡Java使可用getExponent()
或類似。
請注意,這必須在負指數範圍和正指數範圍內正確遞增。
由於指數代表2的冪,所以只需乘以2.這應該增加指數(假設數字在乘法之前和之後都被歸一化)。 (規範化通常會自動發生在Java中,所以這不應該成爲一個問題,除非你正在做一些有趣的事情)。
如果你真的想要的位直接操作,您可以使用Float.floatToIntBits
和來回一個float
和int
鑑於float
的之間的轉換。
正常化是什麼意思?我想確保每次都正確增加數字,並且沒有舍入問題。 –
該死的,那很聰明。 +1 –
@DavidChouinard - 規範化確保尾數的第一位(或第一個隱含位)不爲零。以10爲基礎的科學計數法,它就像使用1.2E2(歸一化)代表120一樣有利於0.12E3(未歸一化)。乘以2時舍入不成問題。 –
這真的很容易。將它轉換爲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
關於負指數的說明有點奇怪。你知道指數是用偏倚127代表嗎? –
@MartijnCourteaux:指數的編碼使用偏差。這個問題只涉及實際的指數,而不是它的編碼。例如,'Math.getExponent'函數返回實際的指數值。引用一個用偏差編碼的負指數而不是用一個用二進制補碼編碼的負整數來引用並不奇怪。 –