2017-02-13 21 views
-1

C言語で書かれた実数型をGNU複数精度演算ライブラリの倍精度浮動小数点数にマッピングしたプロジェクトを継承しました。 GMP)。この実数型のバイト数をテストするために実行時にGMPを使用してCで定義された実数型のバイト数を取得する方法

、私が実行できる:

printf("Storage size for Real type: %d bytes\n", sizeof(Real)); 

は24バイト、すなわち192ビットを与えます。

#define REAL_EPSILON 1e-24 
#define REAL_FORMAT "% 25.24Fe" 
#define REAL_IOTA 1e-96 
#define REAL_PRECISION 128 

誰もがこれらのライン上の任意の光を当てることができます:

はしかし、クラスを定義ファイルには、次の行を持っていますか?私は特に最後の行が数字の小数部のバイト数に128ビットまたは16バイトを示すかどうかについて懸念しています。

+0

これは、仮数部に16バイトがあることを意味しますが、 'Real'構造体には指数部と符号部のメンバーも含まれています。それらは他の8バイトです。 – Barmar

+0

@Barnar:私があなたを理解していることを確認しましょう:16バイトが10進数であると考えると本質的に正しいと言っていますか? –

+0

はい、私はそう思います。確かめたい場合は、ソースコードをチェックして、 'Real'の構造体宣言を見てください。 – Barmar

答えて

2

GMP、GNU 複数精度演算ライブラリ、背後にある考え方は、それが複数(非常に大きな)精度を扱うことができるということです。したがって、sizeofが浮動小数点データ型のために返す固定サイズは意味をなさない。

GMP番号は、実際の番号が格納されている実際のデータへの1つ以上のポインタを持つヘッダ構造体を使用して実装されています。それは数千または数百万ビットで保存された非常に大きな数になる可能性があります。

sizeofはビルトインのC演算子で、ヘッダ構造体のサイズを指定するだけです。この結果は、ヘッダ構造体が24バイトであることを意味します。 ではありません。には精度や桁数とは関係ありません。

+0

@MrMorgan: 'mpf_set_default_prec(128);のように?これはデフォルトの精度を(少なくとも)128ビットに設定します。 –

+0

このような明示的な指示を確認する必要があります。どのドキュメントにはデフォルトの128ビット精度が使用されていると書かれています。 –

+0

GMPを呼び出すコードがそれを設定します。詳細はこちら:https://gmplib.org/manual/Floating_002dpoint-Functions.html#Floating_002dpoint-Functions –

関連する問題