25

少し前に、いくつかの階乗関数を使用するプログラムを書きました。「相対的な」大きな数をサポートするために long double データ型を使用しました。

今、コードブロックから Visualstudio 2010 に変更しました。いくつかの調査の結果、MS が long double データ型を放棄したことに気付くまで、なぜ自分のプログラムが機能しなくなったのか疑問に思っていました。これには特別な理由がありますか?私には、テクノロジーの面で非常に後退しているように見えます。

使用する代替手段はありますか?(boostライブラリからの代替品にも満足しています)。

4

1 に答える 1

19

それが「放棄された」と思う理由はわかりませんlong double.C++標準の一部であるため、準拠した実装ではそれを実装する必要があります.

彼ら「放棄」したのはlong double、数学関数のオーバーロードであり、次の理由でこれを行いました。

ただし、Win32 プログラミングでは、データ型は 64 ビット精度のデータlong double型にマップされます。double

これは、long double古い VS バージョンが 80 ビットであることに加えて、次の理由によるものです。

FP コード生成は、x87 FP スタックの代わりに SSE/SSE2/SSE3 命令セットの使用に切り替えられています。これは、AMD と Intel の最近および将来のチップ世代がパフォーマンスの取り組みに注力しているためです。これらの命令セットは、32 ビットおよび 64 ビットの FP フォーマットのみをサポートします。

それでも、同じサイズdoublelong double型 (両方とも 64 ビットにすることができた) であっても、これらのオーバーロードをサポートしないことを選択したことは残念です。なぜなら、それらはC++ 標準の一部でもあるからです。しかし、まあ、それはあなたのためのマイクロソフトです。ひたすら頑固。

[n3290: 26.8]:doubleの数学関数のバージョンに加えて<cmath>、C++ ではfloatlong doubleこれらの関数のオーバーロードされたバージョンが同じセマンティクスで追加されます。

ただし、これらのオーバーロードは Visual Studio では基本的に非推奨です、引き続き使用できるため、引き続き使用できるはずです。

Microsoft ランタイム ライブラリはlong double、下位互換性のためにのみ数学関数のバージョンを提供します。


使用する代替手段はありますか?(boostライブラリからの代替品にも満足しています)。

long double特定の範囲の数値をサポートするために依存しているように思えますが、その結果、別のツールチェーンで変更されたときに回帰の問題が発生しました。

特定の数値範囲の要件がある場合は、固定範囲の整数型を使用してください。いくつかのオプションがあります:

  • stdint.h- 一部の C++ ツールチェーンが拡張機能としてサポートする C99 機能。
  • stdint.h- Boost がライブラリとして再実装する C99 機能。
  • cstdint- C++0x コードを作成している場合に役立つ可能性のある C++0x 機能。
于 2011-08-19T11:13:09.327 に答える