0

C では、浮動小数点数を使用せずに送信できるように、固定小数点数をバイナリ形式で提示することは可能ですか?

float または double を目的の固定小数点表現に変換する方法は知っていますが、浮動小数点を使用せずに変換するときに行き詰まっています。問題は、私が開発しなければならないシステムにこの制限があることです。

私の考えは、完全な表現と処理可能な整数部分と小数部分を保持する構造体を作成することです。そして、受信したバイナリ表現のみ、または整数値と小数値のいずれかを使用して構造体を作成した後、変換を行う関数が必要になります。

アップデート:

私の質問は十分に正確ではないようですので、詳細を追加します。

私のコード内で、特定の固定小数点表現で数値を作成して受け取る必要があります。以下の回答で説明されているように、これは一連のビットへのポインターにすぎません。私の問題は、情報を受信するときに送信または解釈するときに、この一連のビットを作成する必要があることです。

この変換は、signdness を無視する私の問題です。float を使用して変換できる場合は、簡単に実行できます (コードはテストされていませんが、次のように動作する必要があります)。

float sourceValue = 12.223445;    
int intPart = 0;
float fractPart = 0.0;
//integer part is easy, just cast it
intPart = (int)sourceValue;
//the fractinoal part is the rest
fractPart = sourceValue - intPart;


//multipling the fract part by the precision of the fixed point number (Q9.25)
//gets us the fractional part in the desired representation
u_int64_t factor = 1;
factor = factor << 25;
u_int64_t fractPart = fractPart * factor; 

残りは、いくつかのシフトと論理ビット演算子の使用によって実行できます。

しかし、次のようなものから始めて、途中でフロートなしでこれを行うにはどうすればよいですか。

int intPart = 12;
int fractPart = 223445;

それは可能ですか?言われたとおり、私はここで立ち往生しています。

ご協力いただきありがとうございます!

4

2 に答える 2

1

あなたが実際に何をしようとしているのかはわかりませんが、固定小数点数は定数係数が適用された整数と見なすことができます。

たとえば、区間 [0; で数値を表現したい場合。1) 16 ビットでは、範囲 [0; にマップできます。65536) を単純に 65536 で乗算します。

これは、整数値がどのように見えるか、およびそれらがどのように表現されるかによって完全に異なります。ほとんどの場合、乗算または除算を適用して完了です。

于 2013-06-06T13:17:00.953 に答える
0

整数、浮動小数点数など、すべてがビットに要約されます。必要なのは、メモリベースアドレスとその特定のメモリのサイズだけです。例えば、

float src = 0.5;
float dest;
char bytes[sizeof(src)];    

memcpy(bytes, &num, sizeof(src));
dest = *((float *)bytes);

srcに等しいdestを与える必要があります。

これが役に立ったことを願っています。

于 2013-06-06T12:43:00.977 に答える