HP-UX の libc には、fesetflushtozero
浮動小数点の動作を「段階的なアンダーフロー」と「ゼロへのフラッシュ」の間で切り替える機能があります。
いくつかの Unix libc (glibc を含む) のドキュメントとマニュアル ページをくまなく調べたにもかかわらず、他の Unix で同じことを実現する方法をまだ見つけていません。Linux/glibc、Solaris、AIX に特に関心があります。
HP-UX の libc には、fesetflushtozero
浮動小数点の動作を「段階的なアンダーフロー」と「ゼロへのフラッシュ」の間で切り替える機能があります。
いくつかの Unix libc (glibc を含む) のドキュメントとマニュアル ページをくまなく調べたにもかかわらず、他の Unix で同じことを実現する方法をまだ見つけていません。Linux/glibc、Solaris、AIX に特に関心があります。
ご指摘のとおり、これを行うための標準的な方法はありません (さらに言えば、「ゼロにフラッシュ」の標準的な定義も、ハードウェアがそれを実装する必要もありません)。したがって、これを行う手段はすべてプラットフォーム固有です。これは便利なリファレンスなので、リストにさらにいくつか追加するには:
OSX/インテル: fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)
. これは、 SSE2 を使用して行われるorで行われる演算にのみ影響することに注意してください(名前の由来)。演算は、フラッシュをサポートしない従来の x87 命令を使用して実行されます。float
double
long double
iOS / arm: iOS の 32 ビット ARM では、flush-to-zero がデフォルト モードです。オブジェクトのビットをクリアし、 .__fpscr_flush_to_zero
fenv_t
fesetenv( )
iOS/arm64: fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)
.
なぜC99/UNIX の標準機能fesetround(FE_TOWARDZERO)
があなたに適していないのか疑問に思っています。これは、HP/UX を含むこれらすべてのプラットフォームで同じです。
プラットフォーム固有の、次のものがあります。
fesetflushtozero()
: nonstandard_arithmetic()
ゼロ丸めに切り替える機能があります: 上記以外に AIX に関するものは見つかりませんでしfesetround()
た。