2016-10-05 14 views
1

私はCで作業していますが、long double minlong double maxの値を出力する必要があります。CでLDBL_MAX/MINを定義する

私はfloat.hをヘッダーとして使用しましたが、これらの2つのマクロ(LDBL_MIN/MAX)は、ちょうど2倍であるかのように私に同じ値を与えます。

私はVisual Studio 2015を使用しています。LDBL MINにマウスを移動すると、#define LDBL_MIN DBL_MINと表示されます。それでldbl_minの代わりにdbl_minが印刷されるのですか?

この問題を解決するにはどうすればよいですか?

printf("Type: Long Double Value: %lf Min: %e Max: %e Memory:%lu\n", 
    val10, LDBL_MIN, LDBL_MAX, longd_size); 

私の割り当てはLDBLDBLのための2つの異なる値を必要とするので、それは問題です。

+1

コード/出力だけではなく、コード/出力を投稿してください。なぜあなたは 'LDBL_MAX/DBL_MAX'の値が異なっていなければならない、あるいは問題であると思いますか? – chux

+0

MSVCには、MINに対して#define LDBL_MAX DBL_MAXと同様のものがあります。 'long double'を実装していますが、' double'と同じです。 –

+0

コードは次のとおりです。printf( "タイプ:long double値:%lf最小:%e最大:%eメモリ:%lu \ n"、val10、LDBL_MIN、LDBL_MAX、longd_size); LDBLとDBLに2つの異なる値が必要なので、問題です。 – Tsurupeta

答えて

1

this reference on the lfoating point typesより:

long double - 拡張精度浮動小数点型。サポートされていればIEEE-754拡張浮動小数点型と一致し、それ以外の場合は、精度がdoubleよりも良好で、範囲が少なくともdouble以上の場合はdoubleと一致する限り、非標準拡張浮動小数点型と一致します。一部のx86およびx86_64実装では、80ビットx87浮動小数点型が使用されます。

追加された強調は私のものです。

準拠するCコンパイラではlong double型が必要ですが、実際にはdoubleとは異なる形式でサポートする必要はありません。おそらくVisual Studio Cコンパイラの場合があります。

3

Cでは、long doubleの精度/範囲がdoubleより大きい必要があると指定していません。

ので、実装が異なる種類として扱います場合でも、彼らは、Visual Studioに関するなど同じ実装、範囲、精度、最小値、最大値、

を有していてもよく、MS Long Doubleができます。

fix より大きい精度/範囲でlong doubleをサポートする別のコンパイラを使用してください。おそらくGCC

0

これらのマクロは壊れているか、long doubleはシステム上のdoubleのエイリアスです。テストするには、long doubleをDBL_MAXに設定し、2を掛けてDBL_MAXを引いてください。結果が有限であれば、long doubleに余分な指数スペースがあります。そうでない場合、long doubleがdoubleより大きい場合、余分なバイトは単にパディングするか、同じ指数スペースと精度を持つことができます。したがって、LDBL_MAXの真の値は、DBL_MAXを超える単純な値になります。

maxを生成する最も簡単な方法は、単純にバイナリ表現を調べることです。しかし、あなたがポータブルCでそれをしたいのであれば、繰り返しの乗算によってそれを調べて、大きさを得てから、精度を使い果たすまで2のべき乗を繰り返して仮数を記入してください。

+0

'long int'は' int'より 'better 'である必要はなく、' long double'でも同じです。これで実装が「壊れた」というわけではありません。 –

+0

それは私が言ったことです。 long doubleはdoubleの別名であり、マクロは壊れています。 –

関連する問題