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のサイズが変わる)のようなものが見つかりませんでした。
Qtを使用しています。これはC++に固有なので、質問にCのタグが付けられている理由がわかりません。
私の知る限り、Qtがサポートされているすべてのプラットフォームで、タイプfloat
は32ビットIEEEです。
誰かがQtを64ビットfloat
のCrayベクターマシンに移植することを決めた場合でも、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
のシステムで実行されている場合、要件をどのように満たすことができませんか?
そのようなサイズの浮動小数点型はありませんが、サイズが32ビットであることを常に静的に表明できます。多分グローバルなchar配列のように単純なものです:
#include <climits>
char static_assert_float32[1 - (2 * ((sizeof(float) * CHAR_BIT) != 32))];
負のサイズの配列を宣言することにより、float
が32ビットでない場合、これはコンパイルに失敗します。
CおよびC++の最も一般的な実装では、32ビットのfloat
型を使用します。それが当てはまらないプラットフォームを本当にキャッチする必要がある場合は、以下を使用してプログラムの早い段階でエラーをスローできます。
#include <limits.h>
if (sizeof(float) * CHAR_BIT != 32)
// error code here
残念ながら、コンパイル時にそれを検出する方法がわかりません。以前の答えには問題がありました。
ブール静的メンバー定数std::numeric_limits<float>::is_iec559
は、float
がIEC 559/IEEE 754浮動小数点規格に準拠している場合に限りtrueになります。#include
ヘッダー<limits>
。
これだけでは、float
が具体的に2-bit IEEE浮動小数点であるかどうかはわかりませんが、IEEE浮動小数点であるだけで、32ビット浮動のない一部の実装です。ポイントハードウェアは、たとえば、float
を64ビットIEEE浮動小数点にすることを選択できます。
IEEE-754 float
をサポートするプラットフォームでは、32ビットになります。対応していないプラットフォームでは、幅が異なることで問題が最も少なくなります。結論-float
を使用し、心配しないでください。
Sizeof(float)が32ビットであることを知っていれば十分ですが、すべての場合に不十分です。
IEEE 758は、一般的に実装されているよく知られている32ビットbinary32を定義しています。ただし、IEEE 758では32ビットdecimal32も定義されています。これは、主にストレージではなく、計算に使用されます。他にも、IEEE 758以外の32ビット浮動小数点の実装がありますが、それほど一般的ではありません。
float
が32ビットIEEE 758-2008binary32であることがわかっている場合でも、特定の環境がその厳密に準拠する程度定義(Nan、非正規、丸めモード)は異なる場合があります。これは、32浮動小数点実装の微妙なバリエーションの最大の原因だと私は思います。
したがって、プラットフォーム間で一貫性を保証する可能性が高い、使用される浮動小数点モデルを正確に知るという目標は、コンパイル時に検出するのが非常に難しい場合があります。