Manpages

名 前

feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept − 浮 動 小 数 点 の 丸 め と 例 外 の 取 り 扱 い

書 式

#include <fenv.h>

int feclearexcept(int excepts);
int fegetexceptflag(fexcept_t *
flagp, int excepts);
int feraiseexcept(int
excepts);
int fesetexceptflag(const fexcept_t *
flagp, int excepts);
int fetestexcept(int
excepts);

int fegetround(void);
int fesetround(int
rounding_mode);

int fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *
envp);
int fesetenv(const fenv_t *
envp);
int feupdateenv(const fenv_t *
envp);

−lm で リ ン ク す る 。

説 明

こ れ ら の 11 個 の 関 数 は C99 で 定 義 さ れ て お り 、 浮 動 小 数 点 の 丸 め と 例 外 (オ ー バ ー フ ロ ー 、 ゼ ロ に よ る 除 算 な ど ) の 取 り 扱 い を 規 定 す る 。 例 外

divide−by−zero 例 外 は 、 有 限 の 数 値 に 対 す る 演 算 が 、 無 限 大 の 答 え を 生 成 す る よ う な 場 合 に 起 こ る 。

overflow 例 外 は 、 結 果 が 浮 動 小 数 点 数 値 で 表 記 さ れ な け れ ば な ら な い の に 、 そ の 絶 対 値 が 表 現 可 能 な 浮 動 小 数 点 数 の (有 限 の ) 最 大 値 よ り も (ず っ と ) 大 き く な っ て し ま う よ う な 場 合 に 起 こ る 。

underflow 例 外 は 、 結 果 が 浮 動 小 数 点 数 値 で 表 記 さ れ な け れ ば な ら な い の に 、 そ の 絶 対 値 が 正 の 正 規 化 浮 動 小 数 点 数 の 最 小 値 よ り も 小 さ く な っ て し ま う (そ し て 非 正 規 化 数 で 表 現 し た 場 合 に 非 常 に 精 度 を 失 っ て し ま う ) よ う な 場 合 に 起 こ る 。

inexact 例 外 は 、 丸 め 後 の 演 算 結 果 が 、 無 限 精 度 の 結 果 と 異 な る よ う な 場 合 に 起 こ る 。 overflow 例 外 か underflow 例 外 が 起 き た と き に は 、 常 に こ の 例 外 も 起 こ る 。

invalid 例 外 は 、 演 算 結 果 が う ま く 定 義 で き な い 結 果 を 生 じ る よ う な 場 合 に 起 こ る 。 例 え ば 0/0、 無 限 大 − 無 限 大 、 sqrt(−1) な ど 。 例 外 処 理 例 外 の 表 し 方 に は 2 つ の 方 法 が あ る 。 ひ と つ は 、 単 一 の ビ ッ ト で (例 外 が あ っ た か な か っ た か を ) 表 す 方 法 で 、 こ れ ら の ビ ッ ト は 整 数 の あ る ビ ッ ト 位 置 に 対 応 し 、 ビ ッ ト の 対 応 付 け は 実 装 依 存 で あ る 。 も う 一 つ は 、 内 部 構 造 体 を 使 っ て 表 す 方 法 で 、 こ の 方 法 の 方 が 例 外 に 関 す る よ り 多 く の 情 報 (例 え ば 例 外 が 起 こ っ た コ ー ド の ア ド レ ス な ど ) が 含 ま れ る 。

FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW の 各 マ ク ロ は 、 そ れ ぞ れ 対 応 す る 例 外 の 処 理 を 実 装 が サ ポ ー ト し て い る 場 合 に 定 義 さ れ る 。 こ の と き 対 応 す る ビ ッ ト を そ れ ぞ れ 定 義 す る こ と に な る の で 、 例 外 処 理 関 数 の 呼 び 出 し を 、 例 え ば FE_OVERFLOW|FE_UNDERFLOW と い う 整 数 の 引 き 数 を 用 い て 行 う こ と が で き る 。 他 の 例 外 も サ ポ ー ト さ れ て い る か も し れ な い 。 FE_ALL_EXCEPT マ ク ロ は 、 サ ポ ー ト さ れ て い る 例 外 に 対 応 す る ビ ッ ト が 全 て セ ッ ト さ れ て い る (サ ポ ー ト さ れ て い る 例 外 全 て の 論 理 和 で あ る )。

feclearexcept() 関 数 は 、 引 き 数 excepts の ビ ッ ト 列 で 指 定 さ れ た 例 外 を ク リ ア す る (処 理 は 実 装 で サ ポ ー ト さ れ て い る 例 外 に つ い て の み 行 わ れ る )。

fegetexceptflag() 関 数 は 、 引 き 数 excepts で 指 定 さ れ た 例 外 フ ラ グ の 状 態 を *flagp が 指 す 内 部 オ ブ ジ ェ ク ト に 保 存 す る 。

feraiseexcept() 関 数 は 、 excepts の ビ ッ ト 列 で 指 定 さ れ た 例 外 の う ち 、 実 装 が サ ポ ー ト し て い る も の を 発 生 さ せ る 。

fesetexceptflag() 関 数 は 、 excepts で 指 定 さ れ た 例 外 に 対 応 す る フ ラ グ の 状 態 を *flagp の 値 に 設 定 す る 。 *flagp の 値 は 、 こ の 関 数 を 呼 ぶ 前 に fegetexceptflag() 関 数 を 呼 び 出 し て 取 得 し て お か な け れ ば な ら な い (こ の と き 、 fegetexceptflag() の 最 後 の 引 き 数 に は 、 fesetexceptflag() に 渡 す excepts の す べ て の ビ ッ ト を 含 む 値 を 指 定 す る こ と )。

fetestexcept() 関 数 は 、 excepts 引 き 数 で セ ッ ト さ れ て い る ビ ッ ト の う ち 、 現 在 設 定 さ れ て い る 例 外 に 対 応 す る ビ ッ ト が 1 に な っ た ワ ー ド を 返 す 。 丸 め モ ー ド 丸 め モ ー ド は 、 結 果 が 仮 数 部 だ け で 正 確 に 表 現 で き な い 際 に 、 浮 動 小 数 点 操 作 の 結 果 を ど の よ う に 扱 う か を 決 め る も の で あ る 。 さ ま ざ ま な 丸 め モ ー ド を 提 供 す る こ と が で き る : 最 も 近 い 値 に 丸 め る (デ フ ォ ル ト )、 (正 の 無 限 大 に 向 か っ て ) 大 き く な る 方 向 に 丸 め る 、 (負 の 無 限 大 に 向 か っ て ) 小 さ く な る 方 向 に 丸 め る 、 0 に 向 け て 丸 め る 、 で あ る 。

FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO の 各 マ ク ロ は 、 そ れ ぞ れ 対 応 す る 丸 め の 方 向 を 実 装 が サ ポ ー ト し て い る 場 合 に 定 義 さ れ る 。

fegetround() 関 数 は 現 在 の 丸 め モ ー ド に 対 応 す る マ ク ロ を 返 す 。

fesetround() 関 数 は 丸 め モ ー ド を 引 き 数 に 与 え ら れ た 値 に し 、 成 功 し た ら ゼ ロ を 返 す 。

C99 と POSIX.1−2008 で は FLT_ROUNDS と い う 識 別 子 が 規 定 さ れ て お り 、 <float.h> で 定 義 さ れ て い る 。 こ の 識 別 子 は 浮 動 小 数 点 数 の 加 算 に つ い て の 実 装 定 義 さ れ た 丸 め 動 作 を 表 し 、 以 下 の い ず れ か の 値 を 持 つ 。

−1 丸 め モ ー ド は 決 め ら れ て い な い 。

0

0 に 向 け て 丸 め る 。

1 最 も 近 い 数 に 丸 め る 。

2 正 の 無 限 大 に 向 け て 丸 め る 。

3 負 の 無 限 大 に 向 け て 丸 め る 。 他 の 値 は マ シ ン 依 存 で あ り 、 標 準 的 で は な い 丸 め モ ー ド で あ る 。

FLT_ROUNDS の 値 に は 、 fesetround() で 設 定 さ れ た 現 在 の 丸 め モ ー ド が 反 映 さ れ る べ き で あ る (但 し 、 「 バ グ 」 の 節 を 参 照 )。 浮 動 小 数 点 関 連 の 環 境 浮 動 小 数 点 関 連 の 環 境 の 全 体 は 、 制 御 モ ー ド や 状 態 フ ラ グ も 含 め 、 fenv_t 型 の 内 部 オ ブ ジ ェ ク ト 一 つ で 取 り 扱 う こ と が で き る 。 デ フ ォ ル ト の 環 境 は 、 (const fenv_t * 型 の ) FE_DFL_ENV で 示 さ れ る も の で あ る 。 こ れ は プ ロ グ ラ ム の 開 始 時 に 構 築 さ れ る 環 境 で あ り 、 ISO C で は 、 丸 め モ ー ド を 最 も 近 い 値 へ の 丸 め (FE_TONEAREST) に 設 定 し 、 す べ て の 例 外 を ク リ ア し 、 不 停 止 (nonstop) (例 外 が 起 き て も 継 続 す る ) モ ー ド と す る よ う に 規 定 さ れ て い る 。

fegetenv() 関 数 は 、 現 在 の 浮 動 小 数 点 環 境 を 、 オ ブ ジ ェ ク ト *envp に 保 存 す る 。

feholdexcept() 関 数 も 同 じ 動 作 を 行 い 、 さ ら に 可 能 で あ れ ば 、 全 て の 例 外 フ ラ グ を ク リ ア し 、 nonstop (例 外 時 に も 実 行 を 継 続 ) モ ー ド に 設 定 す る 。

fesetenv() 関 数 は 、 浮 動 小 数 点 環 境 を 、 オ ブ ジ ェ ク ト *envp か ら 取 り 出 し た 値 に 戻 す 。 こ の オ ブ ジ ェ ク ト は 、 有 効 で あ る こ と が 事 前 に 分 か っ て い な け れ ば な ら な い 。 例 え ば 、 fegetenv() や feholdexcept() を 呼 び 出 し た 結 果 で あ る と か 、 FE_DFL_ENV に 等 し い と か で な け れ ば な ら な い 。 こ の 関 数 の 呼 び 出 し は 例 外 を 発 生 し な い 。

feupdateenv() 関 数 は 、 オ ブ ジ ェ ク ト *envp が 表 現 す る 浮 動 小 数 点 環 境 を イ ン ス ト ー ル す る 。 た だ し 、 現 在 発 生 し て い る 例 外 は ク リ ア さ れ な い 。 こ の 関 数 を 呼 ん だ 後 に 立 っ て い る 例 外 は 、 関 数 を 呼 ぶ 前 の 値 と *envp の 値 と の ビ ッ ト ご と の OR を 取 っ た も の に な る 。 上 記 と 同 様 に 、 オ ブ ジ ェ ク ト *envp は 、 事 前 に 有 効 で あ る こ と が 分 か っ て い な け れ ば な ら な い 。

返 り 値

こ れ ら の 関 数 は 、 成 功 の 場 合 0 を 返 し 、 エ ラ ー が 発 生 す る と 0 以 外 を 返 す 。

バ ー ジ ョ ン

こ れ ら の 関 数 は glibc バ ー ジ ョ ン 2.1 で 初 め て 登 場 し た 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 feclearexcept(), fegetexceptflag(), fegetexceptflag(), fesetexceptflag(), fetestexcept(), fegetround(), fesetround(), fegetenv(), feholdexcept(), fesetenv(), feupdateenv(), feenableexcept(), fedisableexcept(), and fegetexcept() は ス レ ッ ド セ ー フ で あ る 。

準 拠

IEC 60559 (IEC 559:1989), ANSI/IEEE 854, C99, POSIX.1−2001.

注 意

glibc で の 注 意 可 能 な 場 合 に は 、 GNU C Library は マ ク ロ FE_NOMASK_ENV を 定 義 す る 。 こ の マ ク ロ は す べ て の 例 外 で ト ラ ッ プ が 生 じ る よ う な 環 境 を 表 す 。 #ifdef を 使 っ て こ の マ ク ロ を テ ス ト で き る 。 こ れ は _GNU_SOURCE が 定 義 さ れ て い る 場 合 に 限 っ て 定 義 さ れ る 。 C99 標 準 は 浮 動 小 数 点 マ ス ク (例 え ば 特 定 の フ ラ グ で の ト ラ ッ プ な ど ) の 各 ビ ッ ト の 設 定 方 法 に つ い て は 定 義 し て い な い 。 バ ー ジ ョ ン 2.2 以 降 の glibc は 、 feenableexcept() 関 数 と fedisableexcept() 関 数 を サ ポ ー ト し て お り 、 各 々 の 浮 動 小 数 点 ト ラ ッ プ を 設 定 で き る よ う に な っ て い る 。 ま た fegetexcept() に よ っ て 状 態 の 問 い 合 わ せ も で き る よ う に な っ て い る 。

#define _GNU_SOURCE /* feature_test_macros(7) 参 照 */
#include <fenv.h>

int feenableexcept(int excepts);
int fedisableexcept(int
excepts);
int fegetexcept(void);

feenableexcept() 関 数 と fedisableexcept() 関 数 は excepts に よ っ て 表 現 さ れ る 各 例 外 の ト ラ ッ プ を 有 効 (無 効 ) に す る 。 成 功 し た 場 合 は 直 前 に 有 効 に な っ て い た 例 外 の セ ッ ト を 返 す 。 失 敗 し た 場 合 は −1 を 返 す 。 fegetexcept() 関 数 は 現 在 有 効 に な っ て い る 例 外 全 て か ら な る セ ッ ト を 返 す 。

バ グ

C99 の 規 定 で は 、 FLT_ROUNDS の 値 に は fesetround() で 設 定 さ れ た 現 在 の 丸 め モ ー ド が 反 映 さ れ る べ き で あ る と さ れ て い る 。 現 在 の と こ ろ 、 こ の よ う に な っ て お ら ず 、 FLT_ROUNDS は 常 に 値 1 と な る 。

関 連 項 目

math_error(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。