std:: modf, std:: modff, std:: modfl
| 
           定义于头文件
            
            
             <cmath>
            
            | ||
| (1) | ||
| 
           
           
           
            
             float
            
            modf
            
             (
            
            
             float
            
            num,
            
             float
            
            
             *
            
            iptr
            
             )
            
            
             ;
            
             
             
              double
             
             modf
             
              (
             
             
              double
             
             num,
             
              double
             
             
              *
             
             iptr
             
              )
             
             
              ;
             
              | (C++23 前) | |
| 
           
            
             constexpr
            
            
             /* floating-point-type */
            
             
             modf
             
              (
             
             
              /* floating-point-type */
             
             num,
              | (C++23 起) | |
| 
           
            
             float
            
            modff
            
             (
            
            
             float
            
            num,
            
             float
            
            
             *
            
            iptr
            
             )
            
            
             ;
            
           
           | (2) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            
             long
            
            
             double
            
            modfl
            
             (
            
            
             long
            
            
             double
            
            num,
            
             long
            
            
             double
            
            
             *
            
            iptr
            
             )
            
            
             ;
            
           
           | (3) | (C++11 起) (C++23 起 constexpr) | 
| 
           
            额外重载
           
           
            (C++11 起)
           
           | ||
| 
           定义于头文件
            
            
             <cmath>
            
            | ||
| 
           
            
             template
            
            
             <
            
            
             class
            
            Integer
            
             >
            
             double modf ( Integer num, double * iptr ) ; | (A) | (C++23 起 constexpr) | 
          std::modf
         
         的重载,分别作为参数
         
          
           num
          
         
         的类型和
         
          
           iptr
          
         
         所指向的类型。
        
        
         
          (since C++23)
         
        
       
      | 
          
           A)
          
          为所有整数类型提供了额外的重载,这些类型被视为
          
           
            double
           
          
          。
          | (since C++11) | 
| 目录 | 
参数
| num | - | 浮点数或整数值 | 
| iptr | - | 指向浮点数值的指针,用于存储整数部分 | 
返回值
如果没有错误发生,返回与 num 同符号的小数部分。整数部分存入 iptr 所指向的值中。
返回值与存储在 * iptr 中的值之和等于 num (允许存在舍入误差)。
错误处理
此函数不受 math_errhandling 中指定的任何错误影响。
如果实现支持 IEEE 浮点算术 (IEC 60559),
- 如果 num 为 ±0,则返回 ±0,并将 ±0 存储于 * iptr 。
- 如果 num 为 ±∞,则返回 ±0,并将 ±∞ 存储于 * iptr 。
- 如果 num 为 NaN,则返回 NaN,并将 NaN 存储于 * iptr 。
- 返回值是精确的, 当前舍入模式 将被忽略。
注释
此函数的行为如同按以下方式实现:
double modf(double num, double* iptr) { #pragma STDC FENV_ACCESS ON int save_round = std::fegetround(); std::fesetround(FE_TOWARDZERO); *iptr = std::nearbyint(num); std::fesetround(save_round); return std::copysign(std::isinf(num) ? 0.0 : num - (*iptr), num); }
额外的重载并不要求完全按照 (A) 的形式提供。只需确保对于整数类型的实参 num , std :: modf ( num, iptr ) 与 std :: modf ( static_cast < double > ( num ) , iptr ) 具有相同效果即可。
示例
比较不同的浮点数分解函数:
#include <cmath> #include <iostream> #include <limits> 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'; // 特殊值 f2 = std::modf(-0.0, &f3); std::cout << "modf(-0) 生成 " << f3 << " + " << f2 << '\n'; f2 = std::modf(-INFINITY, &f3); std::cout << "modf(-Inf) 生成 " << f3 << " + " << f2 << '\n'; }
可能的输出:
给定数值 123.45 或十六进制格式 0x1.edccccccccccdp+6, modf() 生成 123 + 0.45 frexp() 生成 0.964453 * 2^7 logb()/ilogb() 生成 1.92891 * 2^6 modf(-0) 生成 -0 + -0 modf(-Inf) 生成 -INF + -0
参阅
| 
           
            
             
              (C++11)
             
            
            
             
              (C++11)
             
            
            
             
              (C++11)
             
            
           
           | 不大于给定值绝对值的最近整数 (函数) | 
| 
          
           
            C 文档
           
          
          for
          
           
            modf
           
          
          | |