web-dev-qa-db-ja.com

C ++はプラットフォームに依存しない32ビットfloatを宣言します

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を使用しているので、それを使用する解決策があればそれを受け入れます-floatのquint16(プラットフォームによってはqrealのサイズが変わる)のようなものが見つかりませんでした。

20

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

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

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

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

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

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

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

assertが起動する可能性は低いです。起動すると、さらに大きな問題が発生します。

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

12
Keith Thompson

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

#include <climits>

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

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

7
Mark B

CおよびC++の最も一般的な実装では、32ビットのfloat型を使用します。それが当てはまらないプラットフォームを本当にキャッチする必要がある場合は、以下を使用してプログラムの早い段階でエラーをスローできます。

#include <limits.h>
if (sizeof(float) * CHAR_BIT != 32)
    // error code here

残念ながら、コンパイル時にそれを検出する方法がわかりません。以前の答えには問題がありました。

4
Mark Ransom

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

これだけでは、floatが具体的に2-bit IEEE浮動小数点であるかどうかはわかりませんが、IEEE浮動小数点であるだけで、32ビット浮動のない一部の実装です。ポイントハードウェアは、たとえば、floatを64ビットIEEE浮動小数点にすることを選択できます。

1
user3405743

IEEE-754 floatをサポートするプラットフォームでは、32ビットになります。対応していないプラットフォームでは、幅が異なることで問題が最も少なくなります。結論-floatを使用し、心配しないでください。

1
Violet Giraffe

Sizeof(float)が32ビットであることを知っていれば十分ですが、すべての場合に不十分です。

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

floatが32ビットIEEE 758-2008binary32であることがわかっている場合でも、特定の環境がその厳密に準拠する程度定義(Nan、非正規、丸めモード)は異なる場合があります。これは、32浮動小数点実装の微妙なバリエーションの最大の原因だと私は思います。

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