0
A
回答
5
可以使用Java標準的數學庫計算這一點,使用基本規則的對數的變化:
public static final int log2(float f)
{
return (int)Math.floor(Math.log(f)/Math.log(2.0));
}
或者你也可以利用這個信息是IEEE 754浮點數內顯式存儲的事實:
指數實際上包含您正在尋找的答案,您所要做的就是將它一直移到右邊並從中減去127。當然,某些浮點值的指數爲-127(表示爲零)。這些被稱爲低於正常值的值,並且提取它們的對數有點棘手。這是使用查找表發現:
private static final int[] logTable = new int[256];
static
{
logTable[0] = logTable[1] = 0;
for (int i=2; i<256; i++) logTable[i] = 1 + logTable[i/2];
logTable[0] = -1;
}
public static final int log2(float f)
{
int x = Float.floatToIntBits(f);
int c = x >> 23;
if (c != 0) return c - 127; //Compute directly from exponent.
else //Subnormal, must compute from mantissa.
{
int t = x >> 16;
if (t != 0) return logTable[t] - 133;
else return (x >> 8 != 0) ? logTable[t] - 141 : logTable[x] - 149;
}
}
該解決方案,改編自here,比前一個快了不少。這兩種方法都會對負值或無限值,零和NaN產生未定義的結果 - 除非您在複雜的空間中工作,否則它們應該如此。
相關問題
- 1. 計算日誌基地2
- 2. 如何計算整數的Java中的日誌庫2?
- 3. 在uint32_t計算中轉換爲float float
- 4. 日誌基地2 Java進行雙打
- 5. 計算遞歸`日誌(日誌(LOG(134)))`
- 6. 計算素數的日誌
- 7. 基於日期的計算計算
- 8. Java Android:導致計算器顯示整數(需要float/double)
- 9. 如何使用按位運算符計算日誌庫2?
- 10. 基於日誌的總計總計 - SQL
- 11. Float Division計算器
- 12. Java日期計算
- 13. 在Powershell中計算日誌結果
- 14. 基本的Java計算器
- 15. SLF4J Java日誌設計
- 16. 基於OpenOffice的基於Java的計算引擎計算
- 17. 計算機如何計算float 0.1?
- 18. 日期添加計算中的Java「整數太大」
- 19. MySQL計算2日期
- 20. 如何有效地計算樓層日誌庫2 ^(1/4)
- 21. 想要計算各種日誌之間時間的java代碼
- 22. C++如何將int整型爲float/double?
- 23. 使用java計算float數組中遞增數字的總和
- 24. 基本java計算問題
- 25. Java基本計算器
- 26. PHP計算基於功能的日期爲工作日
- 27. Java中的日期差異計算
- 28. 計算Java中的日期差異
- 29. 完整的Elmah日誌記錄設置爲asp.net web api 2
- 30. 2基本的計算機問題
值得注意的是,有一個'Math.getExponent(float)'方法可以爲你做第一部分(從float獲取指數)。 – RealSkeptic