std:: ilogb, std:: ilogbf, std:: ilogbl
|
定义于头文件
<cmath>
|
||
| (1) | ||
|
int
ilogb
(
float
num
)
;
int
ilogb
(
double
num
)
;
|
(C++11 起)
(C++23 前) |
|
|
constexpr
int
ilogb
(
/* 浮点类型 */
num
)
;
|
(C++23 起) | |
|
int
ilogbf
(
float
num
)
;
|
(2) |
(C++11 起)
(C++23 起 constexpr) |
|
int
ilogbl
(
long
double
num
)
;
|
(3) |
(C++11 起)
(C++23 起 constexpr) |
|
#define FP_ILOGB0 /* 由实现定义 */
|
(4) | (C++11 起) |
|
#define FP_ILOGBNAN /* 由实现定义 */
|
(5) | (C++11 起) |
|
定义于头文件
<cmath>
|
||
|
template
<
class
Integer
>
int ilogb ( Integer num ) ; |
(A) |
(C++11 起)
(C++23 起 constexpr) |
std::ilogb
的重载,作为参数
num
的类型。
(since C++23)
形式上,对于非零的
num
,无偏指数是指
log
r
|num|
的整数部分作为有符号整数值,其中
r
是
std::
numeric_limits
<
T
>
::
radix
,而
T
是
num
的浮点类型。
目录 |
参数
| num | - | 浮点数或整数值 |
返回值
若无错误发生,将返回 num 的无偏指数作为有符号整型值。
如果 num 为零,则返回 FP_ILOGB0 。
如果 num 为无穷大,则返回 INT_MAX 。
如果 num 是 NaN,则返回 FP_ILOGBNAN 。
如果正确结果大于 INT_MAX 或小于 INT_MIN ,则返回值是未指定的。
错误处理
错误报告方式遵循 math_errhandling 中的规范。
当 num 为零、无穷大或NaN时,可能出现定义域错误或值域错误。
如果正确结果大于 INT_MAX 或小于 INT_MIN ,则可能出现定义域错误或值域错误。
如果实现支持 IEEE 浮点算术 (IEC 60559),
- 若正确结果大于 INT_MAX 或小于 INT_MIN ,将引发 FE_INVALID 。
- 若 num 为 ±0、±∞ 或 NaN,将引发 FE_INVALID 。
- 其他所有情况下,结果均为精确值(永不引发 FE_INEXACT ),且忽略 当前舍入模式 。
注释
如果 num 不是零、无穷大或 NaN,返回值完全等同于 static_cast < int > ( std:: logb ( num ) ) 。
POSIX要求 ,如果 num 为零、无穷大、NaN,或者正确结果超出 int 的范围,则会发生定义域错误。
POSIX 还要求,在符合 XSI 标准的系统中,当正确结果大于 INT_MAX 时返回的值为 INT_MAX ,当正确结果小于 INT_MIN 时返回的值为 INT_MIN 。
在所有已知实现中,正确结果可以表示为 int 。要发生溢出,必须满足 INT_MAX 小于 LDBL_MAX_EXP * std:: log2 ( FLT_RADIX ) 或 INT_MIN 大于 LDBL_MIN_EXP - LDBL_MANT_DIG ) * std:: log2 ( FLT_RADIX ) 。
std::ilogb
返回的指数值总是比
std::frexp
返回的指数小 1,这是因为两者的归一化要求不同:对于
std::ilogb
返回的指数
e
,
|num*r
-e
|
的取值范围在
1
到
r
之间(通常为
1
到
2
),而对于
std::frexp
返回的指数
e
,
|num*2
-e
|
的取值范围在
0.5
到
1
之间。
额外的重载并不需要完全按照 (A) 的形式提供。它们只需确保对于整数类型的实参 num , std :: ilogb ( num ) 具有与 std :: ilogb ( static_cast < double > ( num ) ) 相同的效果。
示例
比较不同的浮点数分解函数:
#include <cfenv> #include <cmath> #include <iostream> #include <limits> // #pragma STDC FENV_ACCESS ON int main() { double f = 123.45; std::cout << "给定数值 " << f << " 或十六进制格式 " << std::hexfloat << f << std::defaultfloat << ",\n"; double f3; double f2 = std::modf(f, &f3); std::cout << "modf() 生成 " << f3 << " + " << f2 << '\n'; int i; f2 = std::frexp(f, &i); std::cout << "frexp() 生成 " << f2 << " * 2^" << i << '\n'; i = std::ilogb(f); std::cout << "logb()/ilogb() 生成 " << f / std::scalbn(1.0, i) << " * " << std::numeric_limits<double>::radix << "^" << std::ilogb(f) << '\n'; // 错误处理 std::feclearexcept(FE_ALL_EXCEPT); std::cout << "ilogb(0) = " << std::ilogb(0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " 触发了 FE_INVALID 异常\n"; }
可能的输出:
给定数值 123.45 或十六进制格式 0x1.edccccccccccdp+6,
modf() 生成 123 + 0.45
frexp() 生成 0.964453 * 2^7
logb()/ilogb() 生成 1.92891 * 2^6
ilogb(0) = -2147483648
触发了 FE_INVALID 异常
参见
|
(C++11)
(C++11)
|
将数字分解为有效数字和以
2
为底的指数
(函数) |
|
(C++11)
(C++11)
(C++11)
|
提取数字的指数
(函数) |
|
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
|
将数字乘以
FLT_RADIX
的指定次幂
(函数) |
|
C 文档
关于
ilogb
|
|