1

私は C で作業しています。 と の値を出力する必要がある演習を行う必要がlong double minありlong double maxます。

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

LDBL MINVisual Studio 2015 を使用しています。マウスをその上に置くと、#define LDBL_MIN DBL_MIN. dbl_minそれが代わりに印刷される理由ldbl_minですか?

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

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

私の割り当てには と に 2 つの異なる値が必要なため、これは問題LDBLですDBL

4

3 に答える 3

3

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

実装がそれらを異なる型として扱っていても、実装、範囲、精度、最小値、最大値などは同じである可能性があります。

Visual Studio に関しては、MS Long Doubleが役に立ちます。

この問題を解決するlong doubleには、より高い精度/範囲をサポートする別のコンパイラを使用してdoubleください。おそらくGCC

于 2016-10-05T17:33:08.487 に答える
2

浮揚点タイプに関するこのリファレンスから:

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

追加の強調は私のものです。

上記の引用が言っていることは、準拠している C コンパイラはlong double型を持っている必要がありますが、実際には とは異なる方法でサポートする必要はないということですdouble。おそらくVisual Studio Cコンパイラの場合です。

于 2016-10-05T17:32:48.187 に答える
0

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

最大値を生成する最も簡単な方法は、単純にバイナリ表現を調べることです。ただし、ポータブル C で実行する場合は、乗算を繰り返して大きさを取得し、精度がなくなるまで 2 の降べき乗を繰り返し加算して仮数を埋めることができます。

于 2016-10-05T17:41:00.750 に答える