Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ilogb() ใน C++: หาส่วนจำนวนเต็มของลอการิทึมฐาน FLT_RADIX

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_MAX
    • x = 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