名 前
math_error − 数 学 関 数 か ら の エ ラ ー の 検 出
書 式
#include
<math.h>
#include <errno.h>
#include <fenv.h>
説 明
エ ラ ー が 発 生 す る と 、 ほ と ん ど の ラ イ ブ ラ リ 関 数 は (−1 や NULL な ど の ) 特 別 な 値 を 返 す こ と で エ ラ ー を 通 知 す る 。 <math.h> で 宣 言 さ れ て い る 数 学 関 数 は 、 通 常 は 浮 動 小 数 点 値 を 返 す の で 、 他 の 機 構 を 使 っ て エ ラ ー を 通 知 す る 。 エ ラ ー 通 知 機 構 は 2 種 類 あ り 、 古 い も の が errno を 設 定 す る や り 方 で あ り 、 新 し い も の が fenv(3) で 説 明 さ れ て い る 浮 動 小 数 点 例 外 機 構 で あ る 。 (feclearexcept(3) と fetestexcept(3) を 使 用 す る 。 こ れ ら に つ い て は 以 下 で 概 要 を 説 明 し て い る 。 ) 移 植 性 が 必 要 な プ ロ グ ラ ム で 、 数 学 関 数 か ら の エ ラ ー を 確 認 す る 必 要 が あ る 場 合 に は 、 数 学 関 数 を 呼 び 出 す 前 に errno を 0 に 設 定 し 、
feclearexcept(FE_ALL_EXCEPT); を 呼 び 出 す べ き で あ る 。 数 学 関 数 か ら 返 っ て き た 際 に 、 errno が 0 以 外 か 、
fetestexcept(FE_INVALID
| FE_DIVBYZERO | FE_OVERFLOW |
FE_UNDERFLOW); の 呼 び 出 し
が 0 以 外 を 返 し
た 場 合 (fenv(3) 参 照
)、 数 学 関 数 で
エ ラ ー が 発 生
し て い る 。 数
学 関 数 で 発 生
す る エ ラ ー 条
件 に つ い て は
以 下 で 説 明 す
る 。 領 域 エ ラ
ー (domain error) 領 域 エ
ラ ー が 発 生 す
る の は 、 数 学
関 数 に 渡 さ れ
た 引 き 数 の 値
が そ の 関 数 が
定 義 さ れ て い
る 領 域 に 入 っ
て い な い 場 合
で あ る (例 え ば
log(3) に 負 の 引 き
数 を 渡 し た 場
合 )。 領 域 エ ラ
ー が 発 生 す る
と 、 数 学 関 数
は 普 通 は NaN を 返
し (同 じ 状 況 で
違 う 値 を 返 す
関 数 も あ る )、
errno に EDOM を 設 定
し 、 「 無 効
(invalid)」 浮 動 小 数
点 例 外 (FE_INVALID) を
上 げ る 。 極 エ
ラ ー (pole error) 極 エ
ラ ー が 発 生 す
る の は 、 関 数
の 数 学 的 な 結
果 が 無 限 大 そ
の も の と な る
場 合 で あ る (例
え ば 0 の 対 数 は
負 の 無 限 大 で
あ る )。 極 エ ラ
ー が 発 生 す る
と 、 そ の 関 数
の 返 り 値 は (符
号 付 き の ) HUGE_VAL,
HUGE_VALF, HUGE_VALL の い
ず れ か と な る
(前 記 の 値 の う
ち ど れ が 返 る
か は 関 数 の 返
り 値 の 型 に よ
り 決 ま り 、 そ
れ ぞ れ double, float,
long double に 対 応 す
る )。 結 果 の 符
号 は 、 そ の 関
数 の 数 学 的 な
定 義 か ら 決 定
さ れ る 。 errno は
ERANGE に 設 定 さ れ
、 「 0 に よ る 除
算 (divide−by−zero)」 浮
動 小 数 点 例 外
(FE_DIVBYZERO) が 上 が る
。 範 囲 エ ラ ー
(range エ ラ ー ) 範 囲
エ ラ ー が 発 生
す る の は 、 関
数 の 結 果 の 値
が そ の 関 数 の
返 り 値 の 型 で
は 表 現 で き な
い 場 合 で あ る
。 関 数 の 返 り
値 は 、 範 囲 エ
ラ ー が オ ー バ
ー フ ロ ー で あ
っ た か ア ン ダ
ー フ ロ ー で あ
っ た か に よ っ
て 異 な る 。 浮
動 小 数 点 の オ
ー バ ー フ ロ ー
は 、 結 果 が 有
限 だ が 、 大 き
過 ぎ て 結 果 を
返 す 型 で は 表
現 で き な い 場
合 に 発 生 す る
。 オ ー バ ー フ
ロ ー が 発 生 す
る と 、 そ の 関
数 は HUGE_VAL, HUGE_VALF,
HUGE_VALL の い ず れ
か を 返 す (前 記
の 値 の う ち ど
れ が 返 る か は
関 数 の 返 り 値
の 型 に よ り 決
ま り 、 そ れ ぞ
れ double, float, long double
に 対 応 す る )。
errno は ERANGE に 設
定 さ れ 、 「 オ
ー バ ー フ ロ ー
(overflow)」 浮 動 小 数
点 例 外 (FE_OVERFLOW) が
上 が る 。 浮 動
小 数 点 の ア ン
ダ ー フ ロ ー は
、 結 果 が 小 さ
過 ぎ て 、 結 果
を 返 す 型 で は
表 現 で き な い
場 合 に 発 生 す
る 。 ア ン ダ ー
フ ロ ー が 発 生
す る と 、 数 学
関 数 は 通 常 は 0.0
を 返 す (C99 で は 、
指 定 さ れ た 型
に お い て 最 小
の 正 規 化 さ れ
た 正 の 値 よ り
大 き く な い 値
を 持 つ 実 装 定
義 (implementation−defined) の 値
を 返 す 、 と な
っ て い る )。 errno
は ERANGE に 設 定 さ
れ 、 「 ア ン ダ
ー フ ロ ー 」 浮
動 小 数 点 例 外
(FE_UNDERFLOW) が 上 が る
。 い く つ か の
関 数 で は 、 渡
さ れ た 引 き 数
の 値 や 、 正 し
い 関 数 の 結 果
が subnormal (非 正 規 化
数 ) に な る 場 合
に 範 囲 エ ラ ー
を 上 げ る 。 subnormal
な 値 と は 、 0 で
は な い が 、 そ
の 値 が 小 さ す
ぎ て (仮 数 部 の
最 上 位 ビ ッ ト
が 1 と な る ) 標 準
形 で は 表 現 で
き な い よ う な
値 で あ る 。 subnormal
な 値 の 表 現 で
は 、 仮 数 部 の
上 位 側 の ビ ッ
ト に 1 個 以 上 の 0
が 含 ま れ る こ
と に な る 。
注 意
C99 と POSIX.1−2001 で 規 定 さ れ て い る math_errhandling 識 別 子 は glibc で は サ ポ ー ト さ れ て い な い 。 こ の 識 別 子 は 、 2 つ の エ ラ ー 通 知 機 構 (errno と fetestexcept(3) 経 由 で 取 得 で き る 例 外 ) の う ち ど ち ら が 使 用 さ れ て い る か を 通 知 す る こ と に な っ て い る 。 標 準 で は 、 少 な く と も 一 つ は 使 用 さ れ る こ と が 要 求 さ れ て い る が 、 両 方 と も 利 用 可 能 で あ っ て も よ い と さ れ て い る 。 glibc で の 現 在 の (バ ー ジ ョ ン 2.8 で の ) 状 況 は か な り 混 乱 し て い る 。 ほ と ん ど の 関 数 (た だ し 全 部 で は な い ) は エ ラ ー 時 に 例 外 を 上 げ る 。 い く つ か の 関 数 は errno も 設 定 す る 。 errno を 設 定 す る が 、 例 外 を 上 げ な い 関 数 も 少 し だ け 存 在 す る 。 ど ち ら も 行 わ な い 関 数 も ご く 少 数 だ が 存 在 す る 。 詳 細 に つ い て は 個 々 の マ ニ ュ ア ル ペ ー ジ を 参 照 の こ と 。
errno と fetestexcept(3) の 両 方 を 使 っ て エ ラ ー チ ェ ッ ク を 行 う こ と で 複 雑 に な る の を 避 け る た め 、 多 く の 場 合 、 関 数 呼 び 出 し を 行 う 前 に 不 正 な 引 き 数 か の チ ェ ッ ク を 行 う 方 法 が 推 奨 さ れ て い る 。 例 え ば 、 以 下 の コ ー ド は 、 log(3) の 引 き 数 が NaN で も (極 エ ラ ー と な る ) 0 で も (領 域 エ ラ ー と な る ) 0 未 満 で も な い こ と を 保 証 す る も の で あ る 。
double x, r;
if (isnan(x) ||
islessequal(x, 0)) {
/* Deal with NaN / pole error / domain error */ }
r = log(x); こ の ペ ー ジ に 書 か れ て い る こ と は 、 (<complex.h> で 宣 言 さ れ て い る ) 複 素 数 関 数 に は あ て は ま ら な い 。 一 般 に 、 C99 や POSIX.1−2001 で は こ れ ら の 関 数 が エ ラ ー を 返 す こ と を 要 求 し て な い 。
gcc(1) の −fno−math−errno オ プ シ ョ ン を 使 う と 、 実 行 フ ァ イ ル で 、 標 準 の 実 装 よ り も 高 速 な 数 学 関 数 の 実 装 が 使 用 さ れ る よ う に な る が 、 エ ラ ー 時 に errno が 設 定 さ れ な い (gcc(1) の −ffast−math オ プ シ ョ ン を 指 定 し た 場 合 に も −fno−math−errno は 有 効 に な る )。 こ の オ プ シ ョ ン を 指 定 し た 場 合 で も 、 fetestexcept(3) を 使 っ た エ ラ ー の 検 査 は 可 能 で あ る 。
関 連 項 目
gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3)
info libc
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。