std::logb
来自cppreference.com
                    
                                        
                    
                    
                                                            
                    |   定义于头文件  <cmath>
  | 
||
|   float       logb( float arg );  | 
(1) | (C++11 起) | 
|   double      logb( double arg );  | 
(2) | (C++11 起) | 
|   long double logb( long double arg );  | 
(3) | (C++11 起) | 
|   double      logb( Integral 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[编辑] 参阅
|   将数分解为有效数字和 2 的幂次  (函数)  | |
|    (C++11)  | 
  提取数的指数  (函数)  | 
|    (C++11) (C++11)  | 
  将数乘以 FLT_RADIX 的幂次  (函数)  | 
|   logb的 C 文档 
 | |