[H8-ML(4626)] Re: H8/3052で浮動小数点演算がうまくできず困っています。
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2004年04月08日(木)18時10分54秒
藤原と申します。
追加ですが、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


スレッド概略
[4619(R)](起点)
 └[4622(U)]
   └[表示中]
     ├[4627(1)]
     ├[4628(2)]
     └[4629(3)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]