2015-12-15 8 views

答えて

37

:float型、ダブル、そして長いダブル:

[basic.fundamental/8]: 3つの浮動小数点の種類があります。 double型はfloatと同じ精度で少なくとも を提供し、long型doubleは少なくともdoubleと同じ精度を提供します。 float型の値のセットは、double型の値のセットのサブセットです。 double型の値 のセットは、long double型の値の集合のサブセットです。 浮動小数点型の値表現は、実装定義のです。積分型と浮動型は総称して算術 型と呼ばれます。標準テンプレートstd :: numeric_limits(18.3)の特殊化は、実装の最大値 と各算術型の最小値を指定しなければならない。あなたの実装がIEEE-754を使用しているかどうかを確認したい場合は

、あなたはstd::numeric_limits::is_iec559使用することができます。

static_assert(std::numeric_limits<double>::is_iec559, 
       "This code requires IEEE-754 doubles"); 

このエリアの他のヘルパー形質の数、などhas_infinityquiet_NaNmoreがあります。 。

+1

あなたの見積もりは本当に質問に答えません。浮動小数点フォーマットに制限があるかどうか質問されます。あなたの答えは、浮動小数点形式は、実装者によって文書化されなければならないことを示しています。それは関連していますが、実際は同じものではありません。 – hvd

+6

@hvd:数学ライブラリが実装しなければならない必要な範囲と操作を除けば、それは(実装者はドキュメントを提供する必要があります)唯一の制限です。 –

+0

@hvd分かりません。答えにはこれだけの制限がありますか?あなたにとっては十分でしょうか? – TartanLlama

3

std::is_floating_pointのアイデアは、異なる原点のユーザーコードをより良く連携させることです。技術的には、intstd::is_floating_pointとして、未定義の動作を起こすことなく指定することができます。しかし、テンプレートライブラリを持っているとしたら、それは繰り返しT nで分けなければなりません。ライブラリを高速化するために、T ni = 1/nが作成され、nの除算がniの乗算で置き換えられます。これは浮動小数点数には効果的ですが、整数では失敗します。したがって、ライブラリーは、std::is_floating_point<T>::value == trueの場合、最適化を正しく実行します。もしあなたが横たわっていれば、コードはおそらく標準的な観点からは機能しますが、論理的な観点からは間違っています。だから、より大きなのような振る舞いをするクラスを書く場合floatstd::is_floating_pointとマークしてください。これにより最適で正しいコードが得られます。

7

特別な実装は必要ありません。 C++標準では、それについてはあまり話していません。 Cの標準は浮動小数点数のために仮定された概念的なモデルについてかなり詳細に入ります。基数には符号、指数、仮数などがあります。bなど。しかしながら、具体的な実装ではない要件(C11は、21脚注)、これは純粋に記述的であると述べている:

浮動小数点モデルは、各浮動小数点の説明特徴と を明確にすることを意図しています実装の浮動小数点演算が同一である必要はありません。少なくともぶっきらぼう(例えば)通常のモデル(つまり、Aと密接にかなりに合わなかったdoubleの適合実装を生成するように私には思われるが、詳細は異なりますが、言っ

仮数部、指数部など)は難しくなります(少なくとも競争上の性能とは関係がありません)。それは、順序を並べ替える、または別のベースを使用するなど、それが他の方法で変化させることは特に難しいことではありません。

std::numeric_limits<T>::digits(及びstd::numeric_limits<T>::digits10)の定義浮動小数点型は、(少なくともほぼ)大きさのかなり広い範囲にわたってすべての数について同じ精度を保持しなければならないように何が記載されているということはかなり直接的に暗示。これを達成するための最も明白な方法は、有効数字に使用されるいくつかのビット/数字と、指数専用の他の(別個の)ビットセットを持つことです。

+1

'numeric_limits :: digits'と' digits10'の定義はどこかにある意味のある部分から離れるのを難しくしていると思います(ビット表現の仕方は別の問題です)。だから少なくとも、固定幅型を 'double'として密輸して順応させることはできません。あなたがしているように、浮動小数点に制約されていると私は思っています。 –

+0

@SteveJessop:そうですね、それは私の考えでもありました。 –

+0

@SteveJessop 'numeric_limits'のほぼすべてのプロパティに対して' int'をコピー&ペーストすることを禁止しますか? – Yakk

10

C標準には、Cの実装がIEEE 754の後継規格であるIEC 60559に準拠することを意味するものが含まれています(C11ではAnnex Fにあります)。Annex FはIEEE表現の浮動小数点数を持たなければなりません。しかし、この附属書を実装することは任意である。コア標準では、特に浮動小数点数の表現については何も言わないようにしています。

C++に相当する別名があるかどうかわかりません。 N3337には表示されませんが、別途配信される可能性があります。 std::numeric_limits<floating-type>::is_iec559の存在は、C++委員会が少なくともと考えていることを示していますが、これについてはと思っていますが、C委員会と同じくらい細かいことはあまりありません。 (C++標準がC標準の編集セットとして表現されていないことは、常に残念ですが)。

関連する問題