NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Re: 分岐処理

差出人: FUJIHARA Keiichiさん
送信日時 2004/03/08 21:31
ML.NO [beginers:0435]
本文:

藤原と申します。
具体的にどういう処理をしたいのかがよくわからないのであくまでも
想像ですが、「数値ごとに分岐処理はしない方が良い」というのが
結論である可能性が高いと思います。

This message is reply to chero_0723@… - san
(Subject was : [beginers:0434] 分岐処理)

Message-ID: <20040308114600.95212.qmail@…>
in Mon, 8 Mar 2004 20:46:00 +0900 (JST) ...

> double型の変数dataがあります。
> このdataには-9.99999〜+9.99999までの値が入ってきます。
> やりたい処理は、例えばdata = -1.23456の場合に、
> 小数点以下3桁までを取り出し、
> (1) - の時の処理
> (2) . の時の処理
> (3) 1 の時の処理
> (4) 2 の時の処理
> (5) 3 の時の処理
> (6) 4 の時の処理

- の処理も含んでいるところを見ると、単に、文字列に変換したい
というのでしょうか。でしたら、sprintf という関数を見てください。

char buff[32];

sprintf(buff, "%.3f", data);
で、小数点3桁までが文字列として、 buff にコピーされます。
また、(桁数や小数点の位置に注意して)buff の中を見れば、
それぞれの桁数の数字を文字に変換したものが入っています。

あと、それぞれの桁を検出したいのであれば、

int n; などとして、

1) if (data < 0) 最初は - あとの処理のために、 data = -data で
   data を正の数にしておく

2) n = data; で、整数部分が取り出せます。
3) data -= n; で、小数部分だけになります。

4) data *= 10; で、ひと桁シフトします。
5) n = data; でこの時の整数部分(つまり、もともとの小数点
   ひと桁)が取り出せます。

※ data -= n; のかわりに、小数点部分だけを返す関数があるので
それをつかってもよいですね(忘れました)

以下同様。

などもできますが、あまりお勧めはできません。見ていて面倒なので。

また、浮動小数点の処理には誤差がつきものなので、そのあたりにも
注意が必要です。


--
_/ -- Last 3797 hours until ATHENS 2004 Olympic Games -----------------
_/ FUJIHARA Keiichi
_/ E-Mail : keiichi@… <or> nagi@…
_/ URL : http://www.keiichi.fujihara.name/
----------------------------------------------+----- Luna Phase 16.40 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6

このエントリーをはてなブックマークに追加
添付:

このメールは下記のメールに対する返信です:

  • └[beginers:0434]  分岐処理   ("chero_0723…さん)

更新順メールリスト