名稱空間
變體
操作

std::modf, std::modff, std::modfl

來自 cppreference.com
< cpp‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指數函式
(C++11)
(C++11)

(C++11)
(C++11)
冪函式
(C++11)
(C++11)
三角
雙曲函式
(C++11)
(C++11)
(C++11)

誤差函式和伽馬函式
(C++11)
(C++11)
(C++11)
(C++11)
取整浮點運算
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮點操縱函式
(C++11)(C++11)
(C++11)
(C++11)
modf
(C++11)(C++11)
(C++11)
分類和比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
型別
(C++11)
(C++11)
(C++11)
宏常量
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


 
定義於標頭檔案 <cmath>
(1)
float       modf ( float num, float* iptr );

double      modf ( double num, double* iptr );

long double modf ( long double num, long double* iptr );
(直至 C++23)
constexpr /* 浮點型別 */

            modf ( /* 浮點型別 */ num,

                   /* 浮點型別 */* iptr );
(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)
1-3) 將給定浮點值 num 分解為整數部分和小數部分,每個部分都與 num 具有相同的型別和符號。整數部分(浮點格式)儲存在 iptr 所指向的物件中。 庫為所有 cv-unqualified 浮點型別提供了 std::modf 的過載,作為引數 num 的型別和 iptr 的指向型別。(自 C++23 起)
A) 為所有整數型別提供了額外的過載,它們被視為 double
(C++11 起)

目錄

[編輯] 引數

num - 浮點值或整數值
iptr - 指向浮點值的指標,用於儲存整數部分

[編輯] 返回值

如果沒有錯誤發生,返回 num 的小數部分,其符號與 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) 提供額外的過載。它們只需確保對於整數型別的引數 numstd::modf(num, iptr) 具有與 std::modf(static_cast<double>(num), iptr) 相同的效果。

[編輯] 示例

比較不同的浮點分解函式

#include <cmath>
#include <iostream>
#include <limits>
 
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';
 
    // special values
    f2 = std::modf(-0.0, &f3);
    std::cout << "modf(-0) makes " << f3 << " + " << f2 << '\n';
    f2 = std::modf(-INFINITY, &f3);
    std::cout << "modf(-Inf) makes " << f3 << " + " << f2 << '\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
modf(-0) makes -0 + -0
modf(-Inf) makes -INF + -0

[編輯] 另請參閱

(C++11)(C++11)(C++11)
不大於給定值幅度的最接近整數
(函式) [編輯]
C 文件 關於 modf