2

関数のmodf()ファミリーはすべてポインタ パラメータを取ります。

float       modff( float arg, float* iptr );
double      modf( double arg, double* iptr );
long double modfl( long double arg, long double* iptr );

入力の整数部分を返すためarg(小数部分は実際の戻り値です)。

小数部分だけが必要な場合、 を渡して整数部分の計算を「スキップ」できNULLますか?

私が好きだった cppreference ページも、 を渡したときに何が起こるかについても何も言いman modffませんが、他の標準ライブラリ関数の中には、「このパラメーターを無視する」ことを示すものとして NULL を取るものがあります。NULLiptr

4

5 に答える 5

2

modf/modff に NULL を渡すことはできますか?

modf(double arg, double* iptr)と友人は定義された機能を欠いていますiptr == NULL. a を渡すことNULL未定義の動作(UB) です。

後で使用するために整数部分を保存する必要のないワンライナーがコードに必要な場合は、一時的な複合リテラルdoubleを検討し、コンパイラが可能な限り最適化することを信頼してください。

#include <math.h>

double fraction(double x) {
  return modf(x, &(double){0});
}
于 2021-01-05T15:32:30.993 に答える
2

標準はこれを定義していません

説明

2 modf 関数は、引数値を整数部分と小数部分に分割します。それぞれの部分は、引数と同じ型と符号を持ちます。これらは、iptr が指すオブジェクトに整数部分 (浮動小数点形式) を格納します。

戻り値

3 modf 関数は、値の符号付き小数部分を返します。

そのため、通過時の動作NULLは未定義になります。それを許可するコンパイラが見つかるかもしれませんが、これに依存するコードは移植できません (同じコンパイラのバージョン間であっても)。

于 2021-01-05T12:18:23.993 に答える