藤原と申します。 追加ですが、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