ホームページ >バックエンド開発 >C++ >C および x86 アセンブリで浮動小数点丸めモードを効率的に制御するにはどうすればよいですか?

C および x86 アセンブリで浮動小数点丸めモードを効率的に制御するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-27 12:41:14430ブラウズ

How Can I Efficiently Control Floating-Point Rounding Modes in C and x86 Assembly?

C および x86 アセンブリでの浮動小数点丸めの効率的な変更

IEEE 754 浮動小数点数には、最近接、近似などのさまざまな丸めモードが用意されています。ゼロ、正の無限大、負の無限大。丸めモードを変更すると、結果の 10 進表現を正確に制御できるようになります。

C ソリューション

C 標準ライブラリは、fesetround( ) 関数:

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

int main() {
  // Save the original rounding mode
  int originalRounding = fegetround();

  // Set the desired rounding mode (e.g., to zero)
  fesetround(FE_TOWARDZERO);

  // Perform operations with the adjusted rounding mode

  // Restore the original rounding mode
  fesetround(originalRounding);

  return 0;
}

x86 アセンブリ解決策

C99 サポートのないプラットフォームの場合、x86 アセンブリを使用して x87 ユニットと SSE 丸めモードの両方を変更できます。

; x87 unit
fldcw [new rounding mode] ; e.g., FNINIT to nearest

; SSE
ldmxcsr [new rounding mode] ; e.g., MXCSR_RND_NEAREST

Microsoft Visual C

MSVC は、このために非標準の _controlfp() 関数を提供します。目的:

#include <math.h>

int main() {
  // Save the original rounding mode
  unsigned int originalRounding = _controlfp(0, 0);

  // Set the desired rounding mode (e.g., to zero)
  _controlfp(_RC_CHOP, _MCW_RC);

  // Perform operations with the adjusted rounding mode

  // Restore the original rounding mode
  _controlfp(originalRounding, _MCW_RC);

  return 0;
}

丸めモード デコーダ リング

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

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

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