Manpages

名 前

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 を 返 し (同 じ 状 況 で 違 う 値 を 返 す 関 数 も あ る )、 errnoEDOM を 設 定 し 、 「 無 効 (invalid)」 浮 動 小 数 点 例 外 (FE_INVALID) を 上 げ る 。 極 エ ラ ー (pole error) 極 エ ラ ー が 発 生 す る の は 、 関 数 の 数 学 的 な 結 果 が 無 限 大 そ の も の と な る 場 合 で あ る (例 え ば 0 の 対 数 は 負 の 無 限 大 で あ る )。 極 エ ラ ー が 発 生 す る と 、 そ の 関 数 の 返 り 値 は (符 号 付 き の ) HUGE_VAL, HUGE_VALF, HUGE_VALL の い ず れ か と な る (前 記 の 値 の う ち ど れ が 返 る か は 関 数 の 返 り 値 の 型 に よ り 決 ま り 、 そ れ ぞ れ double, float, long double に 対 応 す る )。 結 果 の 符 号 は 、 そ の 関 数 の 数 学 的 な 定 義 か ら 決 定 さ れ る 。 errnoERANGE に 設 定 さ れ 、 「 0 に よ る 除 算 (divide−by−zero)」 浮 動 小 数 点 例 外 (FE_DIVBYZERO) が 上 が る 。 範 囲 エ ラ ー (range エ ラ ー ) 範 囲 エ ラ ー が 発 生 す る の は 、 関 数 の 結 果 の 値 が そ の 関 数 の 返 り 値 の 型 で は 表 現 で き な い 場 合 で あ る 。 関 数 の 返 り 値 は 、 範 囲 エ ラ ー が オ ー バ ー フ ロ ー で あ っ た か ア ン ダ ー フ ロ ー で あ っ た か に よ っ て 異 な る 。 浮 動 小 数 点 の オ ー バ ー フ ロ ー は 、 結 果 が 有 限 だ が 、 大 き 過 ぎ て 結 果 を 返 す 型 で は 表 現 で き な い 場 合 に 発 生 す る 。 オ ー バ ー フ ロ ー が 発 生 す る と 、 そ の 関 数 は HUGE_VAL, HUGE_VALF, HUGE_VALL の い ず れ か を 返 す (前 記 の 値 の う ち ど れ が 返 る か は 関 数 の 返 り 値 の 型 に よ り 決 ま り 、 そ れ ぞ れ double, float, long double に 対 応 す る )。 errnoERANGE に 設 定 さ れ 、 「 オ ー バ ー フ ロ ー (overflow)」 浮 動 小 数 点 例 外 (FE_OVERFLOW) が 上 が る 。 浮 動 小 数 点 の ア ン ダ ー フ ロ ー は 、 結 果 が 小 さ 過 ぎ て 、 結 果 を 返 す 型 で は 表 現 で き な い 場 合 に 発 生 す る 。 ア ン ダ ー フ ロ ー が 発 生 す る と 、 数 学 関 数 は 通 常 は 0.0 を 返 す (C99 で は 、 指 定 さ れ た 型 に お い て 最 小 の 正 規 化 さ れ た 正 の 値 よ り 大 き く な い 値 を 持 つ 実 装 定 義 (implementation−defined) の 値 を 返 す 、 と な っ て い る )。 errnoERANGE に 設 定 さ れ 、 「 ア ン ダ ー フ ロ ー 」 浮 動 小 数 点 例 外 (FE_UNDERFLOW) が 上 が る 。 い く つ か の 関 数 で は 、 渡 さ れ た 引 き 数 の 値 や 、 正 し い 関 数 の 結 果 が subnormal (非 正 規 化 数 ) に な る 場 合 に 範 囲 エ ラ ー を 上 げ る 。 subnormal な 値 と は 、 0 で は な い が 、 そ の 値 が 小 さ す ぎ て (仮 数 部 の 最 上 位 ビ ッ ト が 1 と な る ) 標 準 形 で は 表 現 で き な い よ う な 値 で あ る 。 subnormal な 値 の 表 現 で は 、 仮 数 部 の 上 位 側 の ビ ッ ト に 1 個 以 上 の 0 が 含 ま れ る こ と に な る 。

注 意

C99 と POSIX.1−2001 で 規 定 さ れ て い る math_errhandling 識 別 子 は glibc で は サ ポ ー ト さ れ て い な い 。 こ の 識 別 子 は 、 2 つ の エ ラ ー 通 知 機 構 (errnofetestexcept(3) 経 由 で 取 得 で き る 例 外 ) の う ち ど ち ら が 使 用 さ れ て い る か を 通 知 す る こ と に な っ て い る 。 標 準 で は 、 少 な く と も 一 つ は 使 用 さ れ る こ と が 要 求 さ れ て い る が 、 両 方 と も 利 用 可 能 で あ っ て も よ い と さ れ て い る 。 glibc で の 現 在 の (バ ー ジ ョ ン 2.8 で の ) 状 況 は か な り 混 乱 し て い る 。 ほ と ん ど の 関 数 (た だ し 全 部 で は な い ) は エ ラ ー 時 に 例 外 を 上 げ る 。 い く つ か の 関 数 は errno も 設 定 す る 。 errno を 設 定 す る が 、 例 外 を 上 げ な い 関 数 も 少 し だ け 存 在 す る 。 ど ち ら も 行 わ な い 関 数 も ご く 少 数 だ が 存 在 す る 。 詳 細 に つ い て は 個 々 の マ ニ ュ ア ル ペ ー ジ を 参 照 の こ と 。

errnofetestexcept(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/ に 書 か れ て い る 。