27

C++ で 32 ビット浮動小数点値を宣言する方法はありますか? プラットフォーム/コンパイラに関係なく、常に 32 ビットであることを保証しますか?

そのような整数に対してそれを行うことができます:

#include <stdint.h>

uint32_t var;  //32 bit unsigned integer
uint64_t var1; //64 bit unsigned integer

フロートに対してそのようなことをする方法はありますか? 私の知る限りでは、

float var; //Usually is 32 bit, but NOT GUARANTEED to be 32 bit

実装固有であり、必ずしも32ビットであるとは限りません..(間違っている場合は修正してください)。

私はqtを使用しているので、それを使用するソリューションがあればそれを受け入れます-フロート用のquint16のようなものは見つかりませんでした(qrealはプラットフォームによってサイズが変わります)。

4

6 に答える 6

15

Qtを使用しています。これは C++ に固有のものであるため、質問に C のタグが付けられている理由がわかりません。

私の知る限り、Qt がサポートされているすべてのプラットフォームで、タイプfloatは 32 ビット IEEE です。

誰かが Qt を、たとえば 64 ビットの Cray ベクター マシンに移植することを決定した場合float、32 ビットの浮動小数点型を使用することはできません (ソフトウェアで自分で実装しない限り、わかりませんが、それがどのように役立つか)。

<stdfloat.h>/<cstdfloat>に対応する<stdint.h>/はありません<cstdint>。C および C++ は、 、 、および を提供floatし、doubleそれらlong doubleに最小限の要件を課しますが、特定のサイズの浮動小数点型を要求する方法は提供しません。

あなたの最善の策は、おそらく次のようなものをmain、またはプログラムの起動時に呼び出されることが保証されている関数に追加することです:

assert(CHAR_BIT * sizeof (float) == 32);

またCHAR_BIT == 8、コードが暗黙的にそれに依存している場合も同様です。

が発火する可能性はほとんどありませんassert。発火した場合は、より大きな問題が発生します。

32 ビットの浮動小数点型が本当に必要かどうかを再検討することをお勧めします。コードが 64 ビットのシステムで実行されている場合float、どのように要件を満たせないのでしょうか?

于 2013-09-09T19:35:44.117 に答える
10

そのようなサイズの浮動小数点型はありませんが、サイズが 32 ビットであることを常に静的にアサートできます。たぶん、グローバルな char 配列のような単純なものでさえあります:

#include <climits>

char static_assert_float32[1 - (2 * ((sizeof(float) * CHAR_BIT) != 32))];

float負のサイズの配列を宣言して が 32 ビットでない場合、これはコンパイルに失敗します。

于 2013-09-09T19:53:00.210 に答える
2

IEEE-754 をサポートするプラットフォームでは、float32 ビットになります。そうでないプラットフォームでは、幅が異なることはおそらく問題が最も少ないでしょう。結論 -float心配する必要はありません。

于 2013-09-09T19:15:00.220 に答える
2

Boolean 静的メンバー定数は、IEC 559/IEEE 754 浮動小数点標準に準拠しているstd::numeric_limits<float>::is_iec559場合にのみ true になります。ヘッダーfloatが必要です。#include<limits>

これだけでは、float具体的に32 ビットIEEE 浮動小数点であるかどうかはわかりません。IEEE 浮動小数点であるというだけです。たとえば、32 ビット浮動小数点ハードウェアを使用しない実装では、float64 ビット IEEEを選択する場合があります。浮動小数点。

于 2018-05-31T20:09:14.263 に答える
0

sizeof(float) が 32 ビットであることを知っていれば、一般的には十分かもしれませんが、すべての場合において不十分です。

IEEE 758 は、一般的に実装されているよく知られた 32 ビットのバイナリ32 を定義します。しかし、IEEE 758 では 32 ビットのdecimal32も定義されています。これは主にストレージに使用され、計算には使用されません。IEEE 758 以外の 32 ビット浮動小数点の実装も存在しますが、それほど一般的ではありません。

float32 ビット IEEE 758-2008 binary32であることがわかっている場合でも、特定の環境がその厳密な定義 (Nan、サブノーマル、丸めモード) に準拠する度合いはさまざまです。これは、32-float 実装の微妙なバリエーションの最大の原因だと思います。

したがって、使用される浮動小数点モデルを正確に知るという目標は、プラットフォーム間で一貫性を保証する可能性が高く、コンパイル時に検出するのは非常に困難な場合があります。

于 2013-09-10T02:43:13.637 に答える