2009-08-26 8 views
14

intは通常32ビットですが、標準ではintの幅は一定ではありません。したがって、32ビットの場合は、intを含めると、stdint.hが含まれ、int32_tが使用されます。C/C++の固定幅浮動小数点数

浮動小数点数に対応するものはありますか?浮動小数点数は、同種の形式、つまり符号、指数、仮数で保存されていないので、浮動小数点では少し複雑です。私はちょうどdoubleが1つの符号ビット、10ビットの指数、および52/53ビットの仮数で隠されたビットを数えるかどうかによって64ビットに格納されることが保証されます。

+0

通常、ある種のオブジェクトフラグをエンコードするため、intのビット数が必要です。なぜあなたのフロートの精度についての保証が必要ですか? 多くの場合、私は人がランダム変数の大きさの重要性を過大評価する傾向があることを知りました。マシンのデフォルトのワードサイズを使用する方が、3バイトのメモリを絞り出すことや、32ビットの値を任意に使用する方がよい場合がよくあります。 –

+0

@ Andrew-Khosravian私はスクリプト言語を書いています。私はユーザーにタイプサイズの保証をしたいと考えています。これにより、スクリプト言語で書かれたコードは移植性が向上します。 – Imagist

+2

移植性は問題ありませんが、どこかに線を描く必要があります。結局のところ、あなたのスクリプト言語がPDP-11上で動作するとは思わないでしょう。 IEEE 754をサポートしていないプラットフォームはごくわずかであり、サポートされている場合は、倍精度浮動小数点値であるため、倍精度浮動小数点数が64ビットであるという合理的な前提があります。ユーザがそれを報告できるようにサニティチェックを構築し、そのプラットフォームを個別に処理することができます。プラットフォームがIEEE 754をサポートしていない場合は、あなたがそれを自分で実装しない限り、その表現はとにかく得られません。 –

答えて

3

the current C99 draft standardによると、これは倍数でなければなりません。もちろん、これはあなたのコンパイラが標準のその部分を満たしていることを前提としています。

C++の場合、私は標準の1998バージョンのドラフトと0xをチェックしましたが、どちらもIEEEを指定するnumeric_limitsのboolを超えて、C99標準のその部分のような表現について何も指定していないようですJosh Kelleyのように、754/IEC 559がそのプラットフォームで使用されています。

IEEE 754をサポートしていないプラットフォームはほとんどありません。IEEE 754はよく定義されていて非常にうまく動作するため、一般的にもう1つの浮動小数点形式を設計することはできません。 2倍は実際に64ビットであるという合理的な仮定(IEEE 754-1985は倍精度をフォーマットします。結局それは意味があります)。

doubleが倍精度でない可能性がある場合は、ユーザーが報告でき、そのプラットフォームを個別に処理できるように健全性チェックを作成します。プラットフォームがIEEE 754をサポートしていない場合は、あなたがそれを自分で実装しない限り、その表現はとにかく得られません。

+0

C++ではどうですか? – Imagist

+0

私は、IEEE 754が非常にうまく動作することに同意しない、それはよく定着しているので、otについてはあまり行われない。私はあなたが望むものが二重であることに同意します。そして、間違ったサイズの倍精度浮動小数点数を持つコンパイラが見つかると失敗するサニティチェックを追加します。 –

+0

@dwelch:問題のシェアを持っていない、あるいは常に最良の選択だと言っているわけではありませんが、浮動小数点演算に関しては非常に正確であるか、 IEEE 754は例外的に遅くなることなく、このトリックを行う傾向があります。 –

0

残念ながら、これは保証されません。 <limits>numeric_limits<T>をチェックする必要があります。

もう一度、ダブルは64ビット長ではない実装について聞いたことがありません。仮定したいのであれば、おそらくそれを離れてしまうでしょう。

1

その他の問題は、浮動小数点数の表現です。これは通常、実行しているハードウェアに基づいています(常にそうとは限りません)。ほとんどのシステムはIEEE 754浮動小数点基準を使用していますが、他のシステムも独自の標準を持つことができます(例はVAXコンピュータ)。 IEEE 754 http://en.wikipedia.org/wiki/IEEE_754-2008

1

ウィキペディア、について説明私の知ることの二重フロート/には変化はありません。あなたはSTDのすべてを必要としない場合は、かなり複雑ですが、

#include <limits> 

boost.numeric.boundsに定数が存在しないことはシンプルなインターフェースであるフロートは、年齢のための32ビットとなっているおり、ダブルは64浮動小数点セマンティクスとなっている:: numeric_limits

+0

これはプラットフォーム間で当てはまりません。 – Imagist

+0

私は 'float'と' double'64ビット型の両方を作ったコンパイラ(LCC?)を見たことがあります。 – dan04

3

特定のサイズとフォーマットを保証するタイプについてはわかりませんが、C++ではいくつかのオプションがあります。 <limits>ヘッダーとそのstd::numeric_limitsクラステンプレートを使用して、指定された型のサイズを調べることができます。std::numeric_limits::digitsは仮数部のビット数を示し、std::numeric_limits::is_iec559は型がIEEE形式に従うかどうかを示します。 (ビットレベルでIEEE数値を操作するサンプルコードについては、Google Testのgtest-internal.hのFloatingPointクラステンプレートを参照してください。)

-3

「固定幅タイプ」のこの種の最大の問題の1つは、間違ってしまうのが簡単だということです。おそらく32ビットの整数は必要ありませんでした。ポイントは何ですか?あなたがしたいのは、少なくとも1 >> 31を格納できる整数型です。それはlong intです。あなたはそのために<stdint.h>も必要ありません。

同様に、スクリプト言語では、基礎となるC++ float、少なくとも 32ビットである限り動作するFP型を実装できます。これでも正確な動作は得られません。私はかなり確かですC++は保証しません-1.0/-3.0==1.0/3.0

+0

いいえ、間違いなく32ビット整数が必要です。基本的な型のサイズについては、多くの言語が保証されています(C#とJavaは2つの例です)。 「ポイント」と呼ぶと、すべてのプラットフォームで一貫した動作です。 – Imagist

+0

申し訳ありませんが、そのポイントはありません。スクリプティング言語には正確に32ビットのタイプが必要です。これは決して正確に32ビットのC++型を使う必要はありません。あなたはおそらく保証されたオーバーフロー、保証された%の動作などを望んでいるでしょう。だからあなたはとにかく数学を再実装するつもりです。これをモジュロ2^32にするのは簡単です。 – MSalters

+1

いいえ、それは 'int_least32_t'です。*' long int'ではありません。 – dan04

関連する問題