Man page - fegetexcept(3)

Packages contains this manual

Available languages:

en fr pt_BR es pl ja ru

Manual

FENV

名 前
書 式
説 明
例 外
例 外 処 理
丸 め モ ー ド
浮 動 小 数 点 関 連 の 環 境
返 り 値
バ ー ジ ョ ン
属 性
準 拠
注 意
glibc で の 注 意
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

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 で 初 め て 登 場 し た 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-45020-1.png

準 拠

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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。