名前空間
変種
操作

modf、modff、modfl

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
(C99)(C23)
(C99)
modf
(C23)(C23)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
高速演算インジケータ
 
ヘッダー <math.h> で定義
float       modff( float arg, float* iptr );
(1) (C99以降)
double      modf( double arg, double* iptr );
(2)
long double modfl( long double arg, long double* iptr );
(3) (C99以降)
1-3) 与えられた浮動小数点値 arg を、arg と同じ型かつ同じ符号を持つ整数部と小数部に分解します。arg の整数部(浮動小数点形式)は、iptr が指すオブジェクトに格納されます。

目次

[編集] パラメータ

arg - floating-point value
iptr - 整数部を格納するための浮動小数点値へのポインタ

[編集] 戻り値

エラーが発生しない場合、arg の小数部を、arg と同じ符号で返します。整数部は *iptr が指す値に格納されます。

返された値と *iptr に格納された値の合計は、arg になります(丸め誤差を考慮)。

[編集] エラー処理

この関数は、math_errhandling で指定されたエラーの対象にはなりません。

実装がIEEE浮動小数点算術 (IEC 60559) をサポートしている場合、

  • arg が ±0 の場合、±0 が返され、±0 が *iptr に格納されます。
  • arg が ±∞ の場合、±0 が返され、±∞ が *iptr に格納されます。
  • arg が NaN の場合、NaN が返され、NaN が *iptr に格納されます。
  • 返される値は正確であり、現在の丸めモードは無視されます。

[編集] ノート

この関数は、以下のように実装されているかのように動作します。

double modf(double value, double *iptr)
{
#pragma STDC FENV_ACCESS ON
    int save_round = fegetround();
    fesetround(FE_TOWARDZERO);
    *iptr = std::nearbyint(value);
    fesetround(save_round);
    return copysign(isinf(value) ? 0.0 : value - (*iptr), value);
}

[編集]

#include <float.h>
#include <math.h>
#include <stdio.h>
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.2f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() make %f * %d^%d\n", f / scalbn(1.0, i), FLT_RADIX, i);
 
    // special values
    f2 = modf(-0.0, &f3);
    printf("modf(-0) makes %.2f + %.2f\n", f3, f2);
    f2 = modf(-INFINITY, &f3);
    printf("modf(-Inf) makes %.2f + %.2f\n", f3, f2);
}

実行結果の例

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123.00 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0.00 + -0.00
modf(-Inf) makes -INF + -0.00

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.12.6.12 The modf functions (p: TBD)
  • F.10.3.12 The modf functions (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.12.6.12 The modf functions (p: TBD)
  • F.10.3.12 The modf functions (p: TBD)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.12.6.12 The modf functions (p: 246-247)
  • F.10.3.12 The modf functions (p: 523)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.12.6.12 The modf functions (p: 227)
  • F.9.3.12 The modf functions (p: 460)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.5.4.6 The modf function

[編集] 関連項目

(C99)(C99)(C99)
与えられた値の絶対値より大きくない最も近い整数に丸める
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)