ホームページ >バックエンド開発 >C++ >C で IEEE 754 浮動小数点数の丸めモードを効率的に変更するにはどうすればよいですか?

C で IEEE 754 浮動小数点数の丸めモードを効率的に変更するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 13:02:11768ブラウズ

How Can I Efficiently Change the Rounding Mode for IEEE 754 Floating-Point Numbers in C?

IEEE 754 浮動小数点数の丸めモードの変更

数値計算の領域では、精度の維持と丸め誤差の制御が非常に重要です。 IEEE 754 浮動小数点数は、実数を表現および操作するための標準化されたメカニズムを提供すると同時に、さまざまな精度要件に対応するためのさまざまな丸めモードを提供します。

この質問では、IEEE 754 浮動小数点の丸めモードを変更するための最も効率的なアプローチについて詳しく説明します。 -ポイント番号。主な焦点はポータブル C ソリューションですが、x86 プラットフォーム用のアセンブリ ソリューションも検討されています。

C ベースのソリューション:

ポータブル C コードの場合、標準ソリューションには ライブラリを使用し、fesetround() 関数を利用します。この関数を使用すると、プログラマは希望の丸めモード (たとえば、最も近い方向、ゼロ方向、または正/負の無限大方向) を設定できます。

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

// Store the original rounding mode
const int originalRounding = fegetround();
// Establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// Perform desired operations...
// ...
// Restore the original mode afterwards
fesetround(originalRounding);</p>
<h3>アセンブリベースのソリューション:</h3>
<p>古いプラットフォームの場合C99 サポートが不足している場合は、アセンブリ ソリューションが必要になる場合があります。このようなシナリオでは、丸めモードの調整には通常、fldcw 命令による x87 ユニットと ldmxcsr 命令による SSE ユニットの両方の制御ビットの変更が含まれます。</p>
<h3>MSVC 固有の解決策:</h3>
<p>の場合標準ではありませんが便利なオプションである Microsoft Visual C (MSVC) が利用可能です。 _controlfp() 関数を使用して丸めモードを操作できます。</p>
<pre class="brush:php;toolbar:false">unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// Perform desired operations...
// ...
_controlfp(originalRounding, _MCW_RC);

丸めモードのデコード:

参考までに、さまざまな丸めモードとそれに対応する C および MSVC の名前を以下に示します。 :

Rounding Mode C Name MSVC Name
To nearest FE_TONEAREST _RC_NEAR
Toward zero FE_TOWARDZERO _RC_CHOP
To infinity FE_UPWARD _RC_UP
To -infinity FE_DOWNWARD _RC_DOWN

以上がC で IEEE 754 浮動小数点数の丸めモードを効率的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。