ホームページ >バックエンド開発 >C++ >浮動小数点数を C テンプレート パラメータとして使用できないのはなぜですか?

浮動小数点数を C テンプレート パラメータとして使用できないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-10 01:16:091082ブラウズ

Why Can't I Use Floating-Point Numbers as C   Template Parameters?

浮動小数点値がテンプレート パラメーターとして許可されない理由

C では、次のように浮動小数点値をテンプレート パラメーターとして使用しようとします。次のコードの場合、結果は次のようになりますエラー:

GenericClass<float, 4.6f> gcFloat;
error: `float' is not a valid type for a template constant parameter

標準の禁止事項

C 11 標準によれば、非型テンプレート引数は次のいずれかである必要があります:

  • 整数型または列挙型の変換された定数式
  • 非型テンプレートパラメータ名
  • 静的オブジェクトまたは関数のアドレスを指定する式
  • Null ポインタ
  • Null メンバ ポインタ
  • メンバへのポインタ

ただし、浮動小数点値はこれらのいずれにも当てはまりません

推論

この制限の主な理由は、浮動小数点計算の不正確な性質です。浮動小数点計算は正確に表現できないため、テンプレート引数として使用すると予期しない動作が発生する可能性があります。たとえば、次のコードは、丸めの違いが考えられるため、意図したとおりに動作しない可能性があります。

func<1/3.f>();
func<2/6.f>();

代替ソリューション

浮動小数点値をテンプレート引数として表すには、次のことを考慮してください。 C 11 の高度な定数式 (constexpr) を使用して、コンパイル時に浮動小数点値の分子と分母を計算します。これらは個別の整数引数として渡すことができます。ただし、互いに近い浮動小数点値が同じ分子/分母比をもたらすように、しきい値を定義することが重要です。

以上が浮動小数点数を C テンプレート パラメータとして使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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