ホームページ > バックエンド開発 > C++ > C およびアセンブリで浮動小数点の丸め動作を移植可能に調整するにはどうすればよいですか?

C およびアセンブリで浮動小数点の丸め動作を移植可能に調整するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-24 17:34:16
オリジナル
934 人が閲覧しました

How Can I Portably Adjust Floating-Point Rounding Behavior in C and Assembly?

浮動小数点丸め動作の移植可能な調整

IEEE 754 丸めモードを変更する必要性は、さまざまなシナリオで発生します。この記事では、移植可能な C と x86 アセンブリ言語を使用した両方で、これを実現する効率的な方法を説明します。

C ソリューション

C99 は、丸めモードを操作するための包括的なソリューションを提供します。

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

int main() {
  // Preserve the initial rounding mode
  const int roundingMode = fegetround();

  // Set the desired rounding mode (towards zero)
  fesetround(FE_TOWARDZERO);

  // Perform floating-point operations...

  // Revert to the original rounding mode
  fesetround(roundingMode);

  return 0;
}
ログイン後にコピー

x86 アセンブリ解決策

C99 をサポートしていないプラットフォームでは、x86 アセンブリが代替手段を提供します:

x87 浮動小数点ユニット: fldcw を使用して丸めモードを調整します。

SSE ユニット: ldmxcsr を使用して、 SIMD 丸めモードを構成します。

MSVC 固有のソリューション

Microsoft Visual C には、非標準の _controlfp() 関数が用意されています。

unsigned int roundingMode = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);

// ...

_controlfp(roundingMode, _MCW_RC);
ログイン後にコピー

丸めモード定数

以下表は、丸めモード定数のリファレンスを提供します:

Rounding Mode C Name MSVC Name
Nearest FE_TONEAREST _RC_NEAR
Towards Zero FE_TOWARDZERO _RC_CHOP
Positive Infinity FE_UPWARD _RC_UP
Negative Infinity FE_DOWNWARD _RC_DOWN

以上がC およびアセンブリで浮動小数点の丸め動作を移植可能に調整するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート