std:: scalbn, std:: scalbnf, std:: scalbnl, std:: scalbln, std:: scalblnf, std:: scalblnl
| 
           定义于头文件
            
            
             <cmath>
            
            | ||
| 
           
            
             int
            
           
           指数
           | ||
| (1) | ||
| 
           
           
           
            
             float
            
            scalbn
            
             (
            
            
             float
            
            num,
            
             int
            
            exp
            
             )
            
            
             ;
            
             
             
              double
             
             scalbn
             
              (
             
             
              double
             
             num,
             
              int
             
             exp
             
              )
             
             
              ;
             
              | (C++11 起) (C++23 前) | |
| 
           
            
             constexpr
            
            
             /* 浮点类型 */
            
             scalbn ( /* 浮点类型 */ num, int exp ) ; | (C++23 起) | |
| 
           
            
             float
            
            scalbnf
            
             (
            
            
             float
            
            num,
            
             int
            
            exp
            
             )
            
            
             ;
            
           
           | (2) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            
             long
            
            
             double
            
            scalbnl
            
             (
            
            
             long
            
            
             double
            
            num,
            
             int
            
            exp
            
             )
            
            
             ;
            
           
           | (3) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            
             long
            
           
           指数
           | ||
| (4) | ||
| 
           
           
           
            
             float
            
            scalbln
            
             (
            
            
             float
            
            num,
            
             long
            
            exp
            
             )
            
            
             ;
            
             
             
              double
             
             scalbln
             
              (
             
             
              double
             
             num,
             
              long
             
             exp
             
              )
             
             
              ;
             
              | (C++11 起) (C++23 前) | |
| 
           
            
             constexpr
            
            
             /* 浮点类型 */
            
             scalbln ( /* 浮点类型 */ num, long exp ) ; | (C++23 起) | |
| 
           
            
             float
            
            scalblnf
            
             (
            
            
             float
            
            num,
            
             long
            
            exp
            
             )
            
            
             ;
            
           
           | (5) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            
             long
            
            
             double
            
            scalblnl
            
             (
            
            
             long
            
            
             double
            
            num,
            
             long
            
            exp
            
             )
            
            
             ;
            
           
           | (6) | (C++11 起) (C++23 起 constexpr) | 
| 
           定义于头文件
            
            
             <cmath>
            
            | ||
| 
           
            
             template
            
            
             <
            
            
             class
            
            Integer
            
             >
            
             double scalbn ( Integer num, int exp ) ; | (A) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            Integer
            
             >
            
             double scalbln ( Integer num, long exp ) ; | (B) | (C++11 起) (C++23 起 constexpr) | 
          std::scalbn
         
         和
         
          std::scalbln
         
         的重载版本,其中参数
         
          
           num
          
         
         的类型为对应浮点类型。
        
        
         
          (C++23 起)
         
        
       
      | 目录 | 
参数
| num | - | 浮点数或整数值 | 
| exp | - | 整数值 | 
返回值
       如果未发生错误,则返回
       
        
         num
        
       
       乘以
       
        
         FLT_RADIX
        
       
       的
       
        
         exp
        
       
       次幂(
       
        num×FLT_RADIX
        
         exp
         
        
       
       )。
      
       如果发生因溢出导致的范围错误,将返回
       
        
         ±HUGE_VAL
        
       
       、
       
        ±HUGE_VALF
       
       或
       
        ±HUGE_VALL
       
       。
      
如果发生因下溢导致的范围错误,将返回正确结果(经舍入后)。
错误处理
错误报告方式遵循 math_errhandling 中的规范。
如果实现支持 IEEE 浮点算术 (IEC 60559),
- 除非发生范围错误, FE_INEXACT 永远不会被引发(结果是精确的)。
- 除非发生范围错误, 当前舍入模式 将被忽略。
- 如果 num 是 ±0,则直接返回该值(不作修改)。
- 如果 num 是 ±∞,则直接返回该值(不作修改)。
- 如果 exp 是 0,则直接返回 num (不作修改)。
- 如果 num 是 NaN,则返回 NaN。
注释
       在二进制系统(其中
       
        
         FLT_RADIX
        
       
       为
       
        
         
          2
         
        
       
       )中,
       
        std::scalbn
       
       等价于
       
        
         std::ldexp
        
       
       。
      
       尽管
       
        std::scalbn
       
       和
       
        std::scalbln
       
       被指定为高效执行运算,但在许多实现中,它们的效率仍低于通过算术运算符进行二的幂次乘法或除法操作。
      
       函数名代表“new scalb”,其中
       
        scalb
       
       是一个较旧的非标准函数,其第二个参数为浮点类型。
      
       提供
       
        std::scalbln
       
       函数的原因是:从最小正浮点数值缩放到最大有限值所需的缩放因子可能超过 32767(即标准保证的
       
        
         INT_MAX
        
       
       )。特别地,对于 80 位
       
        
         long
        
        
         double
        
       
       类型,该缩放因子为 32828。
      
       GNU实现不会设置
       
        errno
       
       ,无论
       
        math_errhandling
       
       如何配置。
      
额外的重载并不要求必须严格提供为 (A,B) 形式。只需确保对于整数类型的实参 num 能够满足:
- std :: scalbn ( num, exp ) 的效果等同于 std :: scalbn ( static_cast < double > ( num ) , exp ) 。
- std :: scalbln ( num, exp ) 的效果等同于 std :: scalbln ( static_cast < double > ( num ) , exp ) 。
示例
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "scalbn(7, -4) = " << std::scalbn(7, -4) << '\n' << "scalbn(1, -1074) = " << std::scalbn(1, -1074) << " (最小正次正规双精度浮点数)\n" << "scalbn(nextafter(1,0), 1024) = " << std::scalbn(std::nextafter(1,0), 1024) << " (最大有限双精度浮点数)\n"; // 特殊值 std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n' << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n'; // 错误处理 errno = 0; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "scalbn(1, 1024) = " << std::scalbn(1, 1024) << '\n'; if (errno == ERANGE) std::cout << " errno == ERANGE: " << std::strerror(errno) << '\n'; if (std::fetestexcept(FE_OVERFLOW)) std::cout << " FE_OVERFLOW raised\n"; }
可能的输出:
scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (最小正次正规双精度浮点数)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (最大有限双精度浮点数)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: 数值结果超出范围
    FE_OVERFLOW raised
        参见
| 
           
            
            
            
             
              (C++11)
             
            
            
             
              (C++11)
             
            
           
           | 将数字分解为有效数字和以
         
          2
         
         为底的指数 (函数) | 
| 
           
            
            
            
             
              (C++11)
             
            
            
             
              (C++11)
             
            
           
           | 将数字乘以
         
          2
         
         的整数次幂 (函数) | 
| 
          
           
            C 文档
           
          
          关于
          
           
            scalbn
           
          
          | |