|
|
本章では従来から存在するヘッダファイルに追加されたマクロや関数について説明します。
8.1 ctype.h
ctype.h ヘッダに新たな関数 isblank が追加されました。
isblank
名前 | int isblank(int c); |
ヘッダ | ctype.h |
引数 | c: 検査したい文字コード |
戻値 | 0以外:行の中に置ける空白文字、0:それ以外の文字 |
解説 | isspace 関数を使用すると、空白文字の判定をすることができます。しかしながら、isspace は行を分割する文字コードも空白と認識してしまいます。テキスト処理をするアプリケーションにとってはこれが問題になることがあります。isblank はその文字が、行の中に置ける空白の場合、0 以外の値を返します。 |
8.2 float.h
float.h に新たに、DECIMAL_DIG と FLT_EVAL_METHOD の二つのマクロが追加されました。
float.h 追加マクロ
マクロ名 | 解説 |
DECIMAL_DIG | 浮動小数点型で表現できる最大の10進桁数 (ようするに FLT_DIG, DBL_DIG, LDBL_DIG の最大値)
|
FLT_EVAL_METHOD | 実際に浮動小数点演算を行うときの範囲と精度を示す値
値 | float型 | double型 | long double型 |
0 | FLOAT | DOUBLE | LONG_DOUBLE |
1 | DOUBLE | DOUBLE | LONG_DOUBLE |
2 | LONG_DOUBLE | LONG_DOUBLE | LONG_DOUBLE |
-1 | 確定できない |
<-1 | 実装定義 |
実際の計算は、FLOAT=float 型、DOUBLE=double 型、LONG_DOUBLE=long double 型のもつ範囲と精度で行われる
例えば、FLT_EVAL_METHOD が 1 の時は、float型 ← float型 + float型 の計算でも、float型 ← (float型)((double型)float型 + (double型)float型) として計算が行われる。計算途中でも浮動小数点型の表現範囲とその精度が異なると、同じ値で同じ計算を行っても結果が異なることがある。
|
8.3 math.h
今回、math.h の内容がかなり power up されています。すごいボリュームで書くのが嫌です。新しくマクロ、typedef、関数が追加されたのに加え、ほとんどの関数には double 型、float 型、long double 型を引数として受け取り、結果をその型として返す関数が追加されています。例えば、従来の sin 関数は double sin(double x); しか存在しなかったのが、今回からは、これに加え float sinf(float x);, long double sinl(long double x); のように float 型の関数 xxxxf、long double 型の関数 xxxxl が存在します。まずは、今回は追加された二つの typedef について説明します。
追加された二つの typedef とは float_t と double_t です。これらの実際の型は float.h で定義されている前回説明した FLT_EVAL_METHOD の値により変化します。具体的には次の通りです。ただし float.h が自動的に include されるわけではないので、以下はそのまま使えるわけではありません。
#if FLT_EVAL_METHOD==0
typedef float float_t;
typedef double double_t;
#elif FLT_EVAL_METHOD==1
typedef double float_t;
typedef double double_t;
#elif FLT_EVAL_METHOD==2
typedef long double float_t;
typedef long double double_t;
#else
float_t, double_t は実装依存の型
#endif
|
math.h に新たなマクロが定義されています。また math.h の include で利用可能になるプラグマとしては以前紹介した
#pragma STDC FP_CONTRACT on-off-switch
があります。マクロには関数型マクロも定義されています。これは次回説明します。
math.h 追加マクロ
マクロ名 | 解説 |
HUGE_VAL HUGE_VALF HUGE_VALL | 範囲エラーが起こったときに返される正の double/float/long double 定数(式)。値を正の無限大としてもよい。HUGE_VALF, HUGE_VALL が今回の追加。HUGE_VAL は以前から存在。
|
INFINITY | 正または符号無しの無限大をあらわす float 型の定数(式)に展開される。もしそれができない環境では translation 時にオーバーフローする float 型の正の定数に展開される。
|
NAN | 浮動小数点型が非例外発生 (quiet) NaN を実装しているときだけ定義される。非例外発生 (quiet) NaN を表現する float 型の定数(式)に展開される。
|
FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO | 浮動小数点の値を分類する、それぞれ一意な整数定数(式)。fpclassify( ) マクロの戻り値に使用される。
|
FP_FAST_FMA FP_FAST_FMAF FP_FAST_FMAL | fma/fmaf/fmal(a,b,c) 関数が普通に a*b+c と計算するより早く(例えばハードウエアで直接に)計算できるとき 1 に定義される。
|
FP_ILOGB0 FP_ILOGBNAN | ilogb(x)関数の戻り値として使用される整数定数(式)。x が 0 の時は FP_ILOGB0 (INT_MIN か -INT_MAX を値として推奨)、x が NaN の時は FP_ILOGBNAN (INT_MAX か INT_MIN を値として推奨) が返される。
|
math.h の新たな関数型マクロについて紹介します。
math.h 追加関数型マクロ
マクロ名 | 解説 |
fpclassify(x) | 引数 x が NaN, 無限大, normal, subnormal, 0 かどうかを判定し、結果を、FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO として返す。
|
isfinite(x) | x が無限大または NaN でなければ整数非ゼロを返す。
|
isinf(x) | x が正または負の無限大ならば整数非ゼロを返す。
|
isnan(x) | x が NaN ならば整数非ゼロを返す。
|
isnormal(x) | x が normal (fplassify(x) が FP_NORMAL を返す場合) ならば整数非ゼロを返す。
|
signbit(x) | x が 負のとき整数非ゼロを返す。ゼロや無限大、NaN の時も正負の判定を行って値を返す。
|
math.h 比較関数型マクロ
マクロ名 | 解説
|
---|
isgreater(x, y) | (x) > (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
|
isgreaterequal(x, y) | (x) >= (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
|
isless(x, y) | (x) < (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
|
islessequal(x, y) | (x) <= (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
|
islessgreater(x, y) | (x) > (y) || (x) < (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
|
isunordered(x, y) | (x) と (y) が順序付けできないとき整数 1、さもなくば整数 0 を返す。
|
注: 順序付けできないとは、引数に NaN がある時。具体的には (NaN, 値)、(値, NaN)、(NaN, NaN) の時。 通常の比較演算子を使った比較では NaN があると不正例外が発生する。これらのマクロを使用時にはいかなる時もそのような例外は発生しない。
|
math.h で定義されているほとんどの関数には double 型、float 型、long double 型を引数として受け取り、結果をその型として返す関数が追加されています。例えば、従来の sin 関数は double sin(double x); しか存在しなかったのが、今回からは、これに加え float sinf(float x);, long double sinl(long double x); のように float 型の関数 xxxxf、long double 型の関数 xxxxl が存在します。これに当てはまる math.h に従来から存在している関数は sin/cos/tan / asin/acos/atan/atan2 / sinh/cosh/tanh / exp/log/log10/pow/sqrt / fabs / ceil/floor / fmod/frexp/ldexp があります。今回は、これらの関数の説明は行いません。
さて、これから新たに math.h に追加された関数を説明します。
逆双曲線関数(arc hyperbolic functions): asinh/acosh/atanh
名前 |
asinh |
double | asinh(double x); |
float | asinhf(float x); |
long double | asinhl(long double x); |
|
acosh |
double | acosh(double x); |
float | acoshf(float x); |
long double | acoshl(long double x); |
|
atanh |
double | atanh(double x); |
float | atanhf(float x); |
long double | atanhl(long double x); |
|
ヘッダ | math.h |
引数 | x: asinh/acosh/atanh の演算に対する引数
acosh:x が 1 未満の値で domain error
atanh:[-1,+1]以外だと domain error。x が -1 か +1 の時は range error がおこるかも。
|
戻値 | 演算結果
acosh: [0, +∞]の範囲
|
解説 |
x で示される値を関数の引数として、それぞれ arc hyperbolic sine/arc hyperbolic cosine/arc hyperbolic tangent の演算を行います。
|
指数/対数関数(exponential/logarithmic functions)
名前 | プロトタイプ | 解説 |
exp2 |
double | exp2(double x); |
float | exp2f(float x); |
long double | exp2l(long double x); |
|
2x を計算します。x があまりに大きいと range error の可能性あり。
|
expm1 |
double | expm1(double x); |
float | expm1f(float x); |
long double | expm1l(long double x); |
|
ex-1 を計算します。x があまりに大きいと range error の可能性あり。
|
log2 |
double | log2(double x); |
float | log2f(float x); |
long double | log2l(long double x); |
|
log2 x を計算します。x が 0 未満の場合 domain error。x が 0 だと range error の可能性あり。
|
log1p |
double | log1p(double x); |
float | log1pf(float x); |
long double | log1pl(long double x); |
|
loge (x+1) を計算します。x が -1 未満の場合 domain error。x が -1 だと range error の可能性あり。
|
logb |
double | logb(double x); |
float | logbf(float x); |
long double | logbl(long double x); |
|
x のべき指数を、浮動小数点形式の符号付き整数として取り出します。x が 0 の場合 domain error または range error の可能性あり。
|
ilogb |
int | ilogb(double x); |
int | ilogbf(float x); |
int | ilogbl(long double x); |
|
x のべき指数を符号付き int として取り出します。x が 0 だと range error の可能性あり。
x | 戻り値 |
0 | FP_ILOGB0 |
∞ | INT_MAX |
NaN | FP_ILOGBNAN |
他 | (int)logb(x) |
|
scalbn
scalbln |
double | scalbn(double x, int n); |
float | scalbnf(float x, int n); |
long double | scalbnl(long double x, int n); |
double | scalbln(double x, long n); |
float | scalblnf(float x, long n); |
long double | scalblnl(long double x, long n); |
|
x × FLT_RADIXn を計算します。range error の可能性があります。
scalbn は int 型の引数を、scalbln は long int 型の引数を取る点が違います。
|
べき乗関数(power functions)
名前 | プロトタイプ | 解説 |
cbrt |
double | cbrt(double x); |
float | cbrtf(float x); |
long double | cbrtl(long double x); |
|
3富 を計算します。
|
hypot |
double | hypot(double x, double y); |
float | hypotf(float x, float y); |
long double | hypotl(long double x, long double y); |
|
過度のアンダーフローやオーバーフローなしに、原点からの距離 (x2+y2) を計算します。range error の可能性あり。
|
エラー/ガンマ関数(error/gamma functions)
名前 | プロトタイプ | 解説 |
erf |
double | erf(double x); |
float | erff(float x); |
long double | erfl(long double x); |
|
エラー関数 (error function)
を計算します。(IE だと正しく表示されません。-t2 → -t2)
|
erfc |
double | erfc(double x); |
float | erfcf(float x); |
long double | erfcl(long double x); |
|
補足(?)エラー関数(complementary error function)
を計算します。x が大きすぎると range error の可能性あり。(IE だと正しく表示されません。-t2 → -t2)
|
tgamma |
double | tgamma(double x); |
float | tgammaf(float x); |
long double | tgammal(long double x); |
|
ガンマ関数 Γ(x) を計算します。x が 0 以下の場合 domain error か range error。
x が大きすぎ/小さすぎる場合 range error の可能性あり。
|
lgamma |
double | lgamma(double x); |
float | lgammaf(float x); |
long double | lgammal(long double x); |
|
loge|Γ(x)| を計算します。x が大きすぎる場合、または 0 以下の場合は range error。
|
丸め関数(nearest integer functions)
名前 | プロトタイプ | 解説 |
nearbyint |
double | nearbyint(double x); |
float | nearbyintf(float x); |
long double | nearbyintl(long double x); |
|
x を現在の丸め方向にしたがって、浮動小数点形式の整数値に丸めます。inexact(不正確) 例外は発生しません。
|
rint |
double | rint(double x); |
float | rintf(float x); |
long double | rintl(long double x); |
|
x を現在の丸め方向にしたがって、浮動小数点形式の整数値に丸めます。inexact 例外の発生の可能性あり。
|
lrint
llrint |
long | lrint(double x); |
long | lrintf(float x); |
long | lrintl(long double x); |
long long | llrint(double x); |
long long | llrintf(float x); |
long long | llrintl(long double x); |
|
x を現在の丸め方向にしたがって、最も近い整数値に丸めます。結果が範囲外の場合は結果は未定義で、range error または domain error が発生する可能性があります。
lrint は戻り値が long、llrint はその long long 版。
|
round |
double | round(double x); |
float | roundf(float x); |
long double | roundl(long double x); |
|
x を現在の丸め方向にかかわらず、中間値(0.5)を基準に 0 から遠い方向へ、浮動小数点形式の整数値に丸めます。
|
lround
llround |
long | lround(double x); |
long | lroundf(float x); |
long | lroundl(long double x); |
long long | llround(double x); |
long long | llroundf(float x); |
long long | llroundl(long double x); |
|
x を現在の丸め方向にかかわらず、中間値(0.5)を基準に 0 から遠い方向へ、浮動小数点形式の整数値に丸めます。結果が範囲外の場合は結果は未定義で、range error または domain error が発生する可能性があります。
lround は戻り値が long、llround はその long long 版。
|
trunc |
double | trunc(double x); |
float | truncf(float x); |
long double | truncl(long double x); |
|
現在の丸め方向にかかわらず、x をその値より大きくならない方向に、浮動小数点形式の整数値に丸めます。
|
余り関数(remainder functions)
名前 | プロトタイプ | 解説 |
remainder |
double | remainder(double x, double y); |
float | remainderf(float x, float y); |
long double | remainderl(long double x, long double y); |
|
y が 0 以外のとき定義され、x REM y の結果の値 r を返します。r は r = x - n × y から導かれます。n は x/y を正確に表現するのに最も近い整数値で |n - x/y|=1/2 がいつでも成り立つ偶数です。r が 0 なら符号は x の符号と等しくなります。y が 0 のとき、実装依存で domain error もしくは 0 のどちらかが返ります。
|
remquo |
double | remquo(double x, double y, int *quo); |
float | remquof(float x, float y, int *quo); |
long double | remquol(long double x, long double y, int *quo); |
|
remainder と同じ。quo には、x/y の符号と、2n(n は 3 以上の実装定義値)を法とする x/y の整数の商を持つ値が入ります。y が 0 のとき、remainder 同様、実装依存で domain error もしくは 0 のどちらかが返ります。この場合 quo は不定となります。
|
操作関数(manipulation functions)
名前 | プロトタイプ | 解説 |
copysign |
double | copysign(double x, double y); |
float | copysignf(float x, float y); |
long double | copysignl(long double x, long double y); |
|
x の値と y の符号を持った新しい値を返します。
|
nan |
double | nan(const char *p); |
float | nanf(const char *p); |
long double | nanl(const char *p); |
|
(sprintf(buf, "NAN(%s)", p), strtod(buf, NULL)) と同じ、もしくは、もし p の指す先が NAN(...) に対し有効な文字を指していないとき、または空文字列を指していないときは strtod("NAN", NULL) と同じ、非例外発生(quiet) NaN を返す。もし 非例外発生(quiet) NaN をサポートしていなければ 0 を返す。
|
nextafter |
double | nextafter(double x, double y); |
float | nextafterf(float x, float y); |
long double | nextafterl(long double x, long double y); |
|
y 方向での x の次に表現可能な値を返す。x と y が等しいときは y を返す。range error の可能性あり。
|
nexttoward |
double | nexttoward(double x, long double y); |
float | nexttowardf(float x, long double y); |
long double | nexttowardl(long double x, long double y); |
|
nextafter の第二パラメータ long double 版。
|
最大/最小/正の差関数(maximum, minimum and positive difference functions)
名前 | プロトタイプ | 解説 |
fmax |
double | fmax(double x, double y); |
float | fmaxf(float x, float y); |
long double | fmaxl(long double x, long double y); |
|
x と y のうち、大きい方の値を返す。
|
fmin |
double | fmin(double x, double y); |
float | fminf(float x, float y); |
long double | fminl(long double x, long double y); |
|
x と y のうち、小さい方の値を返す。
|
fdim |
double | fdim(double x, double y); |
float | fdimf(float x, float y); |
long double | fdiml(long double x, long double y); |
|
x > y なら x-y を、それ以外なら +0 を返す。range error の可能性あり。
|
乗算して加算する関数
名前 | プロトタイプ | 解説 |
fma |
double | fma(double x, double y, double z); |
float | fmaf(float x, float y, float z); |
long double | fmal(long double x, long double y, long double z); |
|
x * y + z を返す。丸めは FLT_ROUNDS に従って最後に一度だけ行われる。また、FP_FAST_FMA, FP_FAST_FMAF, FP_FAST_FMAL が定義されていると、それぞれ対応する関数で x * y + z と個別に計算するより高速に計算できる(例えばハードウエアでの一命令による直接計算)。
|
8.4 stdarg.h
stdarg.h ヘッダに新たなマクロが追加されました。それは va_copy です。
va_copy
名前 | void va_copy(va_list dst, va_list src); |
ヘッダ | stdarg.h |
引数 | src:コピー元 dst:コピー先 |
戻値 | なし |
解説 | va_start で va_list を初期化したオブジェクト src のコピー dst を作成する |
可変個数引数を使用する時には、va_start で可変個数引数への参照のためのオブジェクトを初期化し、va_arg で型を指定して可変個数引数を取りだし、va_end を使用してオブジェクトを破棄していました。しかし、途中まで可変個数引数を取り出したけど、実は今までの型が間違っていて、途中から取り出しを再開したいという要求がありました。そのような場合は、始めから va_start を使ってやり直す必要がありました。しかし、この va_copy を用いることで、任意の位置の取り出し位置を覚えておけるので、その位置から再び取り出すことができるようになります。
8.5 stdio.h
stdio.h にはいくつかの関数が新たに追加されました。ただその話題に行く前に、まず printf で書式文字列に %lf が使用可能になったことについて説明しましょう。浮動小数点数を printf ファミリで出力する時には、f,e,g,E,G のどれかを使うと、float 型か double 型の値を出力することができました。ただし、float 型は printf の引数に渡される時点で double 型に拡張されてしまうので、実質は double 型の値を出力する時に指定する変換文字となります。そして、もう一つの浮動小数点数の型 long double 型を指定する時には、Lf,Le,Lg,LE,LG のように大文字の L を前に付けて表現していました。
しかし規格をよく知らない人は、例えば、変換文字に f を使用することを考えると、float 型は f を、double 型はもっと大きいから lf を、long double 型は Lf を使っていることがよくありました。lf という書式文字列は規格では定義されていないので使うべきではないのですが、比較的多くの実装でこの表記が容認されてきました。
今度の C 言語は、このような状況をふまえ、lf の書式文字列を容認することになりました。これで、今まで規格外の書き方をしてきた人は救われましたね (^^)。
次に、stdio.h で追加された新たな関数について説明します。まず、stdio.h ヘッダに新たな関数 snprintf が追加されました。
snprintf
名前 | int snprintf(char * restrict s, size_t n, const char * restrict format, ...); |
ヘッダ | stdio.h |
引数 | s:出力先バッファ n:出力先バッファの文字数 format:書式 ...:書式で指定した値 |
戻値 | n を無限大とした場合に出力されるはずの、終端のヌル文字分を除いた文字数。エラー時は負の値。 |
解説 | sprintf の出力文字数指定版。format に従い文字を書式化して s に最大 n - 1 文字出力する。n - 1 文字以上出力された場合は破棄される。s の終端にはヌル文字が付加される。 参考:wchar_t を受け付ける関数 swprintf があり、これはバッファ文字数を指定できる仕様になっている[update:12/27]。 |
今までの sprintf では出力文字数を指定する方法が無かったので、はみ出さないかどうかどきどきして使う、または直前でオーバーフローしないように気を配ったりする必要がありました。しかし、今回の snprintf を使えばそのような心配もなくなり、安心して書式化文字列を使用できます。
vsnprintf
名前 | int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg); |
ヘッダ | stdio.h |
引数 | s:出力先バッファ n:出力先バッファの文字数 format:書式 arg:va_start で初期化した値 |
戻値 | n を無限大とした場合に出力されるはずの、終端のヌル文字分を除いた文字数。エラー時は負の値。 |
解説 | vsprintf の 出力文字数対応版。format に従い文字を書式化して s に最大 n - 1 文字出力する。n - 1 文字以上出力された場合は破棄される。s の終端にはヌル文字が付加される。 参考:wchar_t を受け付ける関数 vswprintf があり、これはバッファ文字数を指定できる仕様になっている。 |
stdio.h ヘッダに新たに vscanf ファミリー が追加されました。これは、今まで printf の方にはあって、どうして scanf の方には無かったんだろうと、多くの人が思っていたであろう、vscanf, vsscanf, vfscanf といった、va_list を引数に持つ scanf 関係の関数のことです。処理系によっては、始めからこれらの関数を独自のライブラリとして提供していたところも多かったかもしれません。
vscanf
名前 | int vscanf(const char * restrict format, va_list arg); |
ヘッダ | stdio.h |
引数 | format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | scanf の可変個数引数部分を va_list に変更した版。標準入力からの入力を format に従い解析して arg に格納する。 |
vsscanf
名前 | int vsscanf(const char * restrict s, const char * restrict format, va_list arg); |
ヘッダ | stdio.h |
引数 | s:入力バッファ format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | sscanf の可変個数引数部分を va_list に変更した版。文字列 s からの入力を format に従い解析して arg に格納する。 |
vfscanf
名前 | int vfscanf(FILE * restrict fp, const char * restrict format, va_list arg); |
ヘッダ | stdio.h |
引数 | fp:入力ファイルポインタ format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | fscanf の可変個数引数部分を va_list に変更した版。ストリーム fp からの入力を format に従い解析して arg に格納する。 |
8.6 stdlib.h
stdlib.h ヘッダに新たな関数 _Exit が追加されました。
_Exit
名前 | void _Exit(int status); |
ヘッダ | stdlib.h |
引数 | status:終了コード |
戻値 | なし |
解説 | signal や終了関数(atexit で登録された関数)を呼び出さずに、プログラムを終了コード status ですぐに終了させます。 |
ただ、_Exit 関数の情報は Draft の仕様書には記述が無いため、たぶんに推測が含まれています。
stdlib.h ヘッダに strtof、strtold 関数が追加されました。これらは、double を対象とする strtod を、float、long double にも対応させたものです。
strtof strtold
名前 | float strtof(const char *restrict p, char **restrict endp); long double strtold(const char *restrict p, char **restrict endp); |
ヘッダ | stdlib.h |
引数 | p: float 型(strtof) または long double 型(strtold) に変換したい文字列を指すポインタ endp: 解釈を中止したポインタ位置を格納するポインタ |
戻値 | 0: 何も変換されなかったとき +HUGE_VALF(strtof), +HUGE_VALL(strtold): +方向に表現できる範囲を超えた -HUGE_VALF(strtof), +HUGE_VALL(strtold): -方向に表現できる範囲を超えた それ以外: 変換した値 |
解説 |
p で指し示された文字列へのポインタを浮動小数点として解釈し、それを float 型(strtof) または long double 型(strtold) の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、オーバーフローした方向により、strtof の場合は +HUGE_VALF または -HUGE_VALF が、strtold の場合には +HUGE_VALL または -HUGE_VALL が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。
解釈される文字列は、strtod で許されている文字列表現に加え、新しく導入された浮動小数点の16進数表記法も認識し、従来からある、INF、NAN に加え、INFINITY、NAN(DA003) のように NAN の後に( )を加えその中に数字やアルファベット、_ をつなげたものを付加情報として追加したものも認識します(これは NAN として認識します)。またこれらの前に符号をつけることができ、大文字と小文字の区別はなされません。
|
また、strtol、strtoul 関数の機能を long long int 型で処理できるよう新しい関数 strtoll、strtoull 関数が追加されました。
strtoll strtoull
名前 | long long int strtoll(const char *restrict p, char **restrict endp, int base); unsigned long long int strtoull(const char *restrict p, char **restrict endp, int base); |
ヘッダ | stdlib.h |
引数 | p: long long 型(strtoll) または unsigned long long 型(strtoull) に変換したい文字列を指すポインタ endp: 解釈を中止したポインタ位置を格納するポインタ base: 変換時の基数
|
戻値 | 0: 何も変換されなかったとき strtoll の場合 LLONG_MAX: +方向に表現できる範囲を超えた LLONG_MIN: -方向に表現できる範囲を超えた strtoull の場合 ULLONG_MAX: 表現できる範囲を超えた それ以外: 変換した値 |
解説 |
p で指し示された文字列へのポインタを base を基数とした整数として解釈し、それを long long 型の値または unsigned long long 型の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、strtoll は LLONG_MAX または LLONG_MIN が、strtoull では ULLONG_MAX が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。base を 0 にすると文字列から自動的に基数を決定します。
|
atoi、abs、div 関数の機能を long long int 型で処理できるよう新しい関数 atoll、llabs、lldiv 関数が追加されました。
atoll
名前 | long long int atoll(const char *p); |
ヘッダ | stdlib.h |
引数 | p: long long int 型に変換したい文字列を指すポインタ
|
戻値 | 変換した値 |
解説 |
p で指し示された文字列へのポインタを 10 進数の整数として解釈し、それを long long int 型の値として変換した値を返します。エラー時の対応を除くと strtoll(p, NULL, 10) の動作と同じです。
|
llabs
名前 | long long int llabs(long long int val); |
ヘッダ | stdlib.h |
引数 | val: 絶対値を取りたい値
|
戻値 | val の絶対値 |
解説 |
val で示される値の絶対値を返します。絶対値が表現できない場合の動作は未定義です。
|
lldiv
名前 | lldiv_t lldiv(long long int num, long long int denom); |
ヘッダ | stdlib.h |
引数 | num: 非除数 denom: 除数
|
戻値 | 除算結果 |
解説 |
num / denom の除算の結果を lldiv_t 型の値として、商をメンバ名 quot、余りをメンバ名 rem に返します。
|
8.7 wchar.h
wchar.h ヘッダに新たに vscanf ファミリー が追加されました。これは、今まで printf の方にはあって、どうして scanf の方には無かったんだろうと、多くの人が思っていたであろう、vwscanf, vswscanf, vfwscanf といった、va_list を引数に持つ scanf 関係の関数のことです。処理系によっては、始めからこれらの関数を独自のライブラリとして提供していたところも多かったかもしれません。
vwscanf
名前 | int vwscanf(const wchar_t * restrict format, va_list arg); |
ヘッダ | wchar.h |
引数 | format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | wscanf の可変個数引数部分を va_list に変更した版。標準入力からの入力を format に従い解析して arg に格納する。 |
vswscanf
名前 | int vswscanf(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg); |
ヘッダ | wchar.h |
引数 | s:入力バッファ format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | swscanf の可変個数引数部分を va_list に変更した版。文字列 s からの入力を format に従い解析して arg に格納する。 |
vfwscanf
名前 | int vfwscanf(FILE * restrict fp, const wchar_t * restrict format, va_list arg); |
ヘッダ | wchar.h |
引数 | fp:入力ファイルポインタ format:書式 arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値 |
戻値 | 変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。 |
解説 | fwscanf の可変個数引数部分を va_list に変更した版。ストリーム fp からの入力を format に従い解析して arg に格納する。 |
stdlib.h ヘッダに wcstof、wcstold 関数が追加されました。これらは、double を対象とする wcstod を、float、long double にも対応させたものです。
wcstof wcstold
名前 | float wcstof(const wchar_t *restrict p, wchar_t **restrict endp); long double wcstold(const wchar_t *restrict p, wchar_t **restrict endp); |
ヘッダ | wchar.h |
引数 | p: float 型(wcstof) または long double 型(wcstold) に変換したい文字列を指すポインタ endp: 解釈を中止したポインタ位置を格納するポインタ |
戻値 | 0: 何も変換されなかったとき +HUGE_VALF(wcstof), +HUGE_VALL(wcstold): +方向に表現できる範囲を超えた -HUGE_VALF(wcstof), +HUGE_VALL(wcstold): -方向に表現できる範囲を超えた それ以外: 変換した値 |
解説 |
p で指し示された文字列へのポインタを浮動小数点として解釈し、それを float 型(wcstof) または long double 型(wcstold) の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、オーバーフローした方向により、wcstof の場合は +HUGE_VALF または -HUGE_VALF が、wcstold の場合には +HUGE_VALL または -HUGE_VALL が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。
解釈される文字列は、wstrtod で許されている文字列表現に加え、新しく導入された浮動小数点の16進数表記法も認識し、従来からある、INF、NAN に加え、INFINITY、NAN(DA003) のように NAN の後に( )を加えその中に数字やアルファベット、_ をつなげたものを付加情報として追加したものも認識します(これは NAN として認識します)。またこれらの前に符号をつけることができ、大文字と小文字の区別はなされません。
#2000/03/04:NAN(...)の部分を修正
|
また、wcstol、wcstoul 関数の機能を long long int 型で処理できるよう新しい関数 wcstoll、wcstoull 関数が追加されました。
wcstoll wcstoull
名前 | long long int wcstoll(const wchar_t *restrict p, wchar_t **restrict endp, int base); unsigned long long int wcstoull(const wchar_t *restrict p, wchar_t **restrict endp, int base); |
ヘッダ | wchar.h |
引数 | p: long long 型(wcstoll) または unsigned long long 型(wcstoull) に変換したい文字列を指すポインタ endp: 解釈を中止したポインタ位置を格納するポインタ base: 変換時の基数
|
戻値 | 0: 何も変換されなかったとき wcstoll の場合 LLONG_MAX: +方向に表現できる範囲を超えた LLONG_MIN: -方向に表現できる範囲を超えた wcstoull の場合 ULLONG_MAX: 表現できる範囲を超えた それ以外: 変換した値 |
解説 |
p で指し示された文字列へのポインタを base を基数とした整数として解釈し、それを long long 型の値または unsigned long long 型の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、wcstoll は LLONG_MAX または LLONG_MIN が、wcstoull では ULLONG_MAX が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。base を 0 にすると文字列から自動的に基数を決定します。
|
8.8 wctype.h
wctype.h ヘッダに新たな関数 iswblank が追加されました。
iswblank
名前 | int iswblank(wint_t c); |
ヘッダ | wctype.h |
引数 | c: 検査したい文字コード |
戻値 | 0以外:行の中に置ける空白文字、0:それ以外の文字 |
解説 | iswspace 関数を使用すると、空白文字の判定をすることができます。しかしながら、iswspace は行を分割する文字コードも空白と認識してしまいます。テキスト処理をするアプリケーションにとってはこれが問題になることがあります。iswblank はその文字が、行の中に置ける空白の場合、0 以外の値を返します。 |
ただ、iswblank 関数の情報は Draft の仕様書には記述が無いため、たぶんに推測が含まれています。
|
|
|