C
1#include <stdio.h> 2#include <stdlib.h> 3union fl{ 4 char var[4]; 5 float fvar; 6}; 7int main(void){ 8 union fl uni_fl; 9 uni_fl.fvar=180762; 10 uni_fl.fvar/=1000; 11 printf("%f\n",uni_fl.fvar); 12}
上記コードの実行結果が
180.761993
となってしまいます.この計算結果をさらに別の処理に使うので,計算結果としてuni_fl.fvarに格納される値が「180.762」になるようしたいのですが,どうしたらいいでしょうか.
ちなみに,別の処理というのはこの計算結果のバイトオーダーを(BIG_ENDIANからLITTLE_ENDIAN)に変換して出力したいのですが,その場合は
C
1int i; 2for(i=3;i<=0;i--){ 3 printf("%c",uni_fl.var+i); 4}
こんな感じでいいのでしょうか?
コードにスペルミスがありますよ。ini_flとなっている部分があります。
ご指摘ありがとうございます。
質問入力時のタイプミスなので修正しておきました。
>BIG_ENDIANからLITTLE_ENDIAN・・・・モトローラ形式からインテル形式にするのですか?
そうです。
さらにいえば、180.762が4バイト aa bb cc ddで保存されていたとして、dd cc bb aaに書き換えて、180.762のとき同様に先頭から読み取ったらどんな数字が出力されるのか知りたいということになります。
えっと、どうしたいかは分かるのですが、なぜそれが必要かが分からないのですが・・・
https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html の説明でも分からないですか?
所属機関で課された課題なので必要になってます。
誤差については理解しました。今回の課題文を読み直してみると数値を1000で計算した値を直接変数に入れても良さそうだったのでプログラム側で誤差なしの計算を実現することは諦めました。
なんか、課題の解釈が間違えてませんか?
Big → Littleなんてのは、通信とかでデータを送る場合(普通は逆)にありますが、それはバイト列なので、printf()で出力しても仕方が無いと思います。
あ、"180.762" 見ると 7桁。 1byteに2文字の BCDだと4byteで収まる。まさかと思うけど、こっち?
4バイトの BCD で float を表現するのは, ビットが足り無さそうです...^^;
課題文を全部貼ってもらったほうがいいかもしれませんね(^_^;)
回答5件
あなたの回答
tips
プレビュー