ilogb() คืออะไร?
ilogb() ฟังก์ชันใน <cmath> คืนค่า **ส่วนจำนวนเต็ม (exponent)** ของลอการิทึมฐาน FLT_RADIX (ปกติคือ 2) ของ |x|
คือ: หา i ที่ทำให้ FLT_RADIX^i ≤ |x| < FLT_RADIX^(i+1)
Syntax
int ilogb(double x);
int ilogbf(float x);
int ilogbl(long double x);
Parameters
x- ค่าที่ต้องการหา exponent
Return Value
- Exponent เป็น int (floor(logFLT_RADIX(|x|)))
- กรณีพิเศษ:
x = NaN→ คืนFP_ILOGBNAN(มักเป็นINT_MIN)x = ±∞→ คืนINT_MAXx = 0→ คืนFP_ILOGB0(มักเป็นINT_MIN)
ตัวอย่าง
#include <cfloat>
#include <cmath>
#include <iostream>
using namespace std;
int main() {
cout << "ilogb(2) = " << ilogb(2) << "\n"; // 1 (2^1 = 2)
cout << "ilogb(10.23) = " << ilogb(10.23) << "\n"; // 3 (2^3 = 8 ≤ 10.23 < 16)
cout << "ilogb(1) = " << ilogb(1) << "\n"; // 0 (2^0 = 1)
cout << "ilogb(0.5) = " << ilogb(0.5) << "\n"; // -1 (2^-1 = 0.5)
cout << "ilogb(0) = " << ilogb(0) << "\n"; // FP_ILOGB0
cout << "FLT_RADIX = " << FLT_RADIX << "\n"; // 2
return 0;
}
Output
ilogb(2) = 1 ilogb(10.23) = 3 ilogb(1) = 0 ilogb(0.5) = -1 ilogb(0) = -2147483648 // FP_ILOGB0 (implementation-defined) FLT_RADIX = 2
ความสัมพันธ์กับ frexp()
frexp(x, &exp) แยก x = mantissa × 2^exp โดย 0.5 ≤ |mantissa| < 1
→ ilogb(x) == exp - 1 (เพราะ frexp ใช้ mantissa ใน [0.5, 1) ส่วน ilogb ใช้ [1, 2))
ใช้ทำอะไรได้บ้าง?
- วิเคราะห์ขนาดของ floating point number
- Implement log base 2 แบบ integer
- Normalize numbers
- Debug floating point representation
สรุป
ilogb(x) คืน exponent ของ x ในรูปแบบทวิคณิต (base 2 ปกติ) เป็น integer โดยตรง ไม่ต้องคำนวณ log แล้ว floor