Cygwin なんでも掲示板

一覧最新記事過去一覧 | 検索FAQアンテナHOME
(新規投稿・発言はできません)


スレッド

└◇527:
計算したときの丸目について [pon] 08/10 22:33

 ├◇528:Re:計算したときの丸目について [pon] 08/10
 ├◇531:Re:計算したときの丸目について [水口] 08/12
 ├◇533:Re:計算したときの丸目について [MSだす] 08/13
 ├◇537:Re:計算したときの丸目について [な] 08/13
 └◇538:Re:計算したときの丸目について [pon] 08/14
  └◇539:Re[2]:計算したときの丸目について [水口] 08/14
   └◇540:Re[3]:計算したときの丸目について [pon] 08/15
    └◇542:Re[4]:計算したときの丸目について [MSだす。] 08/15
     └◇545:Re[5]:計算したときの丸目について [pon] 08/16 <


527● 計算したときの丸目について[ pon ] 2002 08/10 22:33
いつもお世話になっております。またまたponです。
Cの勉強をしていて、scanfという標準関数を使って入力した小数を、とりあえず小数点3桁で丸めて小数点2桁表示させるプログラムを教本から見てやってみたんですが、教本には小数点3桁目を四捨五入すると書いてあるのですが、私がやると四捨五入したり五捨六入になったりまちまちになります。おそらくプログラムの記述の中には丸目に関する記述はないと思うんですが、四捨五入に統一するにはどうすればよいのかヒントだけでも与えていただけると助かります。どうかよろしくお願いします。尚、プログラムを下に記します。
#include <stdio.h>

int main()
{
float fnum;

scanf("%f",&fnum);
printf("入力データ = %.2f\n",fnum);

return 0;
}
スレッド一覧


528● Re:計算したときの丸目について[ pon ] 2002 08/10 22:38
すいません。gccは3-1です。Cygwinも本日最新に直しました。よろしくお願いします。
スレッド一覧


531● Re:計算したときの丸目について[ 水口 ] 2002 08/12 23:21
# 本件には無関係ながら、入門時は、us-asciiだけでソースを書く方が落とし穴が減りますよ。

printf()で、丸め結果だけてなく丸め前も表示させると、
入力した数値が入力したとおりの値ですか?
スレッド一覧


533● Re:計算したときの丸目について[ MSだす。 ] 2002 08/13 08:36
たしかponさんはgcc 3.0.4をソースからコンパイル
してましたよね。ということはこの問題もそのgcc 3.0.4
でのことでしょうか。
もしそうならCygwin自体が用意してくれているgccを
使った方が良いと思います。
Cygwinでの現在のgccの安定版は、

gcc -> gcc 2.95.3-5
gcc2 -> gcc 2.95.3-9

となっています。
なお、Cygwinのgcc 2.95.3-5で試したところ、
ponさんが言うようにはならにように見えます。
スレッド一覧


537● Re:計算したときの丸目について[ な ] 2002 08/13 22:16
C で数値計算をやるなら、奥村先生の本をまず読んだほうが早いです。
「C言語による最新アルゴリズム事典」奥村晴彦、技術評論社,1991
ISBN4-87408-414-1
なぜ四捨五入がうまくいかないかの説明もちゃんと載っています。
スレッド一覧


538● Re:計算したときの丸目について[ pon ] 2002 08/14 18:41
水口さんMSだすさん[な]さん御助言ありがとうございます。
水口さんがおっしゃっていた方法は、試してみましたが、入力データに異常は無く、変換データについては症状変わらずでした。また、us-asciiってのがわからないので調べてから実行してみます。
MSだすさんから御指摘いただいたgccのVer.はまだ試してないんですが、私の使ったVer.はgcc-3.1でした。以前の私の質問時にアドバイスいただいた、ともたけさんのVer.でやっていたという次第です。
[な]さんが教えてくれたアルゴリズム辞典は是非買ってみようと思ってます。生憎、給料日前なのでも少しかかりますが、一度立ち読みに行ってこようと思ってます。
御三方とも以前の私の質問をチェックしていてくれたり、素人丸出しの私に御親切にアドバイスしていただき本当にありがとうございます。質問も質問の作文もまだハナタレですが、がんばりますのでよろしくお願いします。
スレッド一覧


539● Re[2]:計算したときの丸目について[ 水口 ] 2002 08/14 22:37
> 水口さんがおっしゃっていた方法は、試してみましたが、入力データに異常は無く、

あれ、そうですか? 0.005を代入したはずのfloat変数を %.10f で表示させると、0.004999999888 とかになりませんか?
これをもとに小数第3位を四捨五入してゼロになるのは正しい処理です。問題は、float変数が0.005を誤差含みでしか表現できないところにあります。

このあたりのことも、きっと[な]さんの紹介された書籍には書かれているんだと思います。

しかし、表現誤差・計算誤差の問題は、入門用のテーマにはちょっと重いので、先送りにするのも一考かと。
#境界値以外(0.0051とか)では正常なんですよね?

> また、us-asciiってのがわからないので調べてから実行してみます。

あらら。517のスレッドも ponさんでしたか、失礼しました。「\を含む漢字」のことをを言ったんですよ。
スレッド一覧


540● Re[3]:計算したときの丸目について[ pon ] 2002 08/15 01:04
水口さんさっそくの返答ありがとうございます。すいません、float変数なんですが、%fでやってました。%.10fにすると水口さんの御指摘どおりになりました。素人にはなかなか奥の深いところに首を突っ込んでしまったようで、自分でも驚いてました。と言うことは丸目に関する記述か何かを加えるなり(本当にそうなんでしょうか?)、MSだすさんのおっしゃるgcc-2.95.3-5するべきということですね。みずぐちさんの御指導に従って誤差問題は、も少し私が大人になってから(年だけは大人なんですけどね)取り組むようにしてみます。もちろん本は仕入れようと思いますが。また、us-asciiってそういう事だったのですね。ありがとうございます。漢字と誤差は少し先送りにして、勉強を進めてみます。手の付け所が把握できないもので、やみくもに教本を消化しようとしてるんですが、皆さんからいただいたアドバイスで、形になってきました。とは言うもののハナタレなのは相変わらずなので厳しいですが、ガリっとやってみます。ちいとお盆なので行事を消化してるうちに時間が過ぎてもったいないんですが、こつこつやってみます。アドバイスありがとうございました。
スレッド一覧


542● Re[4]:計算したときの丸目について[ MSだす。 ] 2002 08/15 05:59
538>私の使ったVer.はgcc-3.1でした

でしたね、すいません。良く見てませんでした。

>MSだすさんのおっしゃるgcc-2.95.3-5
>するべきということですね。

gcc-3.1というのが(setup.exeで
インストールされる)Cygwinのgccなら、
それはそれで良いのかもしれません。
(setup.exeで、Expを選ぶと出てくるやつですね。)

ただ、gcc-2.95にしたほうが、余計な心配しなくて
済みます。

なお、"な"さんや、水口さんが指摘なさっているように
0.005を入力して
0.00 と出力されるということなら
それは、ある意味正常な反応です。
私のCygwin gcc 2.95.3-5で実行すると
0.0049 -> 0.00
0.005 -> 0.00
0.0050000001 -> 0.00
0.0050000002 -> 0.01
0.0051 -> 0.01
0.0052 -> 0.01
というふうに( これは5捨6入ではないよ;-) )。
また、
1.234999 -> 1.23
1.235 -> 1.24
となります。

計算機はご存知の通りすべてを2進数で処理します。
10進数で有限小数でも、2進数では、無限小数に
なることがあり、
それを有限2進小数に丸めて処理されるため
わずかな誤差が生じこのようなことが
起こります。
スレッド一覧


545● Re[5]:計算したときの丸目について[ pon ] 2002 08/16 20:32
MSだすさんありがとうございます。ニシンスウですか。なんとなくはわかってるつもりでも、とっつきにくいテーマに感じます。生憎まだ[な]さんに教えていただいた本を仕入れてないんですが、解説まで入れていただいてありがとうございました。また、gccのVer.ですが、なるたけ新しいもので安定したものを使おうと言うことでの所業でした。やっぱりソースファイルからコンパイルして使用してました。
そして丸目については、MSだすさんとやり方はちと違ったんですが、
0.225
元データ = 0.225000
変換後データ = 0.22
0.115
元データ = 0.115000
変換後データ = 0.12
というのが、疑問のきっかけで

0.225
元データ = 0.2249999940
変換後データ = 0.22
.115
元データ = 0.1150000021
変換後データ = 0.12
というのが水口さんからのご指導でわかったと言うことでした。ニシンスウって難しいですね。皆さんのご指導に従っても少し教本を増やしてみようと思ってます。[な]さんに教えていただいた本のほかにも、推薦本などございましたら教えてください。ちなみに、私の使ってる教本は「標準プログラマーズライブラリ はじめてのC言語完全入門」(塚越一雄著 技術評論社)でした。
スレッド一覧

早田のホームページへ
CGIROOM