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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 06:46:13425ブラウズ

Why Can't Floating-Point Values Be Used as C   Template Parameters?

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

デフォルト パラメーターとして浮動小数点値を使用してジェネリック クラス テンプレートをインスタンス化しようとすると、コンパイラがエラーを発行します。整数値は期待どおりに機能しますが、浮動小数点は機能しません。

浮動小数点引数の標準制限

C 11 標準 (14.3.2/1) によると、非型のテンプレート引数は、 -type テンプレート パラメータは特定のルールに従う必要があります。制限の 1 つは、浮動小数点値を使用できないことです。代わりに、それらは整数型または列挙型、テンプレート パラメーター型の変換された定数式、またはその他の特定の構成要素である必要があります。

動機付け要因としての浮動小数点の不正確性

この制限は、おそらく浮動小数点計算の不正確な性質。浮動小数点値を正確に表現することは常に実現可能であるとは限らず、不正確さが発生して予期しない動作が発生する可能性があります。次の例を考えてみましょう。

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

同じ関数を 2 回呼び出すことが意図されていますが、1/3 と 2/6 の浮動小数点表現は、丸め誤差の可能性があるため、同一であるとは保証されません。これにより、意図しない関数呼び出しが発生する可能性があります。

代替アプローチ

目的がテンプレート引数として何らかの方法で浮動小数点値を表すことである場合、1 つのオプションは C 11 定数式 (constexpr) を利用することです。 。これらを使用すると、コンパイル時に浮動小数点値の分子と分母を計算でき、それらを個別の整数引数として渡すことができます。

ただし、浮動小数点値がそれぞれの値に近づくように、しきい値を定義することが重要です。他のものは同じ分子/分母のペアを共有します。それ以外の場合、浮動小数点値を非型テンプレート引数として制限する背後にある理論的根拠は引き続き有効です。

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

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