藤原と申します。
追加ですが、ANSI 準拠の処理系では以下のことも言えます。
This message is reply to K.Koizumi - san
(Subject was : [H8-ML(4622)] Re: H8/3052で浮動小数点演算がうまくできず困っています。)
Message-ID: <20040408161214Mn!FF2@xxxxxxxxxxxxxxxxxxxxxxx>
in Thu, 08 Apr 2004 16:12:14 +0900 ...
まず、オリジナルのソースで、結果が「0」になってしまったのは、型変換の
使い方が間違っていた正でもあるのですが、これは、
unsigned int(fc_3); //型変換
によって、ここで、ローカル変数である、fc_3 が新たに定義されてしまった
からです。
この時(自動変数なので)初期値は暗黙のうちに「0」になります。
これは、fc_3 という同じ変数を2度定義したことになりますが、最初の
fc_3 は、関数の外で定義されているため、グローバル変数となり、
関数の中で定義された fc_3 (ローカル変数)が優先されてしまうため
エラーになりません。
もしも、fc_1, fc_2, fc_3 を test() の中で定義していれば、ここで
エラーになったはずです。
他の事情もあり、もしも、fc_1, fc_2, fc_3 を test() の中でしか使わな
いのであれば、test() の中で定義する方が安全です。
> -> unsigned int(fc_3); //型変換
> -> fc_dbg1 = fc_3; //内容表示 本来”6”のはずが”0”になってしまう。
>
> この2行が誤りです。型変換は、その変数の型自体を変えてしまう
> 物ではありません。fc_3 を float型で定義した以上、もうその型を
> 後で変える事は出来ません。但し、以下の様に「型変換」で自分の
> 型を偽装し、別変数に代入させることは可能です。
>
> fc_dbg1 = (unsigned int)fc_3; // これが正しい型変換
ついでに言えば、この場合明示的な型変換は不要です。
fc_dbg1 = fc_3;
で、自然な型変換ができます。
関数のプロトタイプなども同様で、
int func(int a);
を、
func(0.1);
などと呼び出した場合、自然な型変換で、 a = 0 として処理されます。
また、
int func()
{
double a = (いろいろな処理)
return a;
}
でも、自然な型変換で a の整数部分が返されます。
メモリの制約がきつい時をのぞいて、浮動小数点は、(float ではなく)
double で定義した方がよいです。
単に精度の問題だけではなく、例えば、 0.1 という数値を書いたときに
この値は、double だと解釈されるからです。
このため、
float a;
a = 0.1;
if (a == 0.1) ....
とした場合、この比較は普通は失敗します。
double a;
とするか、
a = 0.1f;
if (a == 0.1f)
と、明示的に float であることを示す必要があります。
あと、math.h に定義されている数学関数の引数や返値も
double です。
--
_/ -- Last 3057 hours until ATHENS 2004 Olympic Games -----------------
_/ FUJIHARA Keiichi
_/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx
_/ URL : http://www.keiichi.fujihara.name/
----------------------------------------------+----- Luna Phase 18.01 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6