std::logb, std::logbf, std::logbl
来自cppreference.com
定义于头文件 <cmath>
|
||
float logb ( float arg ); float logbf( float arg ); |
(1) | (C++11 起) |
double logb ( double arg ); |
(2) | (C++11 起) |
long double logb ( long double arg ); long double logbl( long double arg ); |
(3) | (C++11 起) |
double logb ( IntegralType arg ); |
(4) | (C++11 起) |
1-3) 从浮点参数
arg
提取独立于基底的无偏指数,并将它作为浮点值返回。正式而言,无偏指数是非零 arg 的 log
r|arg| 的有符号整数部分(此函数作为浮点值返回),其中 r
是 FLT_RADIX 。若 arg
为非正规,则当做它如同已正规化。
参数
arg | - | 浮点值 |
返回值
若不出现错误,则返回作为有符号浮点值的 arg
的无偏指数。
若出现定义域错误,则返回实现定义值。
若出现极点错误,则返回 -HUGE_VAL
、 -HUGE_VALF
或 -HUGE_VALL
。
错误处理
报告 math_errhandling 中指定的错误。
若 arg
为零则可能出现定义域或值域错误。
若实现支持 IEEE 浮点算术( IEC 60559 ),则
- 若
arg
为 ±0 ,则返回 -∞ 并引发 FE_DIVBYZERO 。 - 若
arg
为 ±∞ ,则返回 +∞ 。 - 若
arg
为 NaN ,则返回 NaN 。 - 所有其他情况下,结果是准确的(决不引发 FE_INEXACT )且忽略当前舍入模式。
注意
POSIX 要求若 arg
为 ±0 则出现极点错误。
std::logb
所返回的指数值始终比 std::frexp 所返回的小 1 ,因为不同的正规化要求:对于 logb
返回的指数 e
, |arg*r-e
| 在 1 与 r
之间(典型地在 1 与 2 之间),但 frexp 返回的指数 e
, |arg*2-e
| 在 0.5 与 1 之间。
示例
比较不同的浮点分解函数
运行此代码
#include <iostream> #include <cmath> #include <limits> #include <cfenv> #pragma STDC FENV_ACCESS ON int main() { double f = 123.45; std::cout << "Given the number " << f << " or " << std::hexfloat << f << std::defaultfloat << " in hex,\n"; double f3; double f2 = std::modf(f, &f3); std::cout << "modf() makes " << f3 << " + " << f2 << '\n'; int i; f2 = std::frexp(f, &i); std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n'; i = std::ilogb(f); std::cout << "logb()/ilogb() make " << f/std::scalbn(1.0, i) << " * " << std::numeric_limits<double>::radix << "^" << std::ilogb(f) << '\n'; // 错误处理 std::feclearexcept(FE_ALL_EXCEPT); std::cout << "logb(0) = " << std::logb(0) << '\n'; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << " FE_DIVBYZERO raised\n"; }
可能的输出:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex, modf() makes 123 + 0.45 frexp() makes 0.964453 * 2^7 logb()/ilogb() make 1.92891 * 2^6 logb(0) = -Inf FE_DIVBYZERO raised
参阅
(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 的幂次 (函数) |