|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第465回 四捨五入 発行 2004年6月23日(水曜日) 発行数 約2900 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 ・セキュリティ突破のため、暗号化された単語があります。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 カボチで神秘の鎧が手に入るという重大ニュースを聞いた あゆしゃは、早速、結婚前夜のセーブデータからプレイをやり なおしました。 なれたもので、すいすいと攻略していき、いざ、カボチへ! と したとき。 ★カボチのどこにも、宝箱おじさんがいない! なぜ? ここぞとばかりにインターネットで調べ、★出なければ入手でき ないことが判明。 早速★にして、神秘の鎧をゲットしました。 続いて、メダル王からも神秘の鎧をゲット、二刀流です。 これはすごいと、調子にのったあゆしゃは、ブオーンに闘いを 挑みました。 いつもは、青年後期直後ではとても勝てないのですが、 ★あっさり撃破。 すごーい! /*========================================================*/ 株日記 /*========================================================*/ 野村のバーチャル株式投資倶楽部 http://www2.nomura.co.jp/vstock/VirtualServlet? (ゲストでログインして Ayusya を探せば成績を参照できます) ★ここ一週間の Ayusya の成績 火曜日 1,001,661円です。(23,376番/93,123人中) 水曜日 998,909円です。(53,718番/93,670人中) 木曜日 1,000,437円です。(26,558番/94,188人中) 日曜日 1,005,811円です。(21,491番/96,025人中) 月曜日 1,005,189円です。(21,684番/96,725人中) 火曜日 1,013,536円です。(21,045番/97,376人中) やった、利益1万円越えだ〜!! 順位があまりあがっていないのは、参加者がどんどん増えている からです。 それにしても、1万円ずつちまちまと買って、現在69銘柄。 少し面倒くさくなってきたのは、気のせいでしょうか。 {magclick} /*========================================================*/ 今回のお題 << 四捨五入 >> /*========================================================*/ 前回悩んだ問題、解決しました。 犯人は、toFloatString の a.mul( CXInt().fromString( "1" + CString( '0', SMALL_BIT_SIZE ) ) ); この人でした。 というのも、この時点で a は SMALL_BIT_SIZE ビットであり、 ここに SMALL_BIT_SIZE 桁の10進数をかけると、オーバーフロー すると言うものでした。 SMALL_BIT_SIZE 桁の10進数は、バイナリに読み込むと850 バイトもありました。 256バイト+850バイト=1106バイトで、オーバー フローです。 いやはや。 SMALL_SIZE は、SIZE / 8 ということにしましょう。 有効少数桁数は、1024桁ぐらいということになります。 /*========================================================*/ さて、話を元に戻しまして、今回は四捨五入です。 1.2+3.4=4.59999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999 9999999999999999999999999999999999(略) 9、多すぎです。 四捨五入が必要な場所は、9が並ぶのでしょうか。 では、9が並んでいる場合を切り上げましょう。 // 9が並びすぎている場合 int pos = st.Find( "9999999999" ); if( pos >= 0 ) { // 桁を1つ上げる for( int i = pos; i > 0; i-- ) { char ch = st.GetAt( i - 1 ); if( ch == '9' ) ch = '0'; else ch++; st.SetAt( i - 1, ch ); if( ch != '0' ) break; } st = st.Left( pos ); } else { // 0が並びすぎている場合、排除する pos = st.Find( "0000000000" ); if( pos >= 0 ) st = st.Left( pos ); } ret += st; toFloatString の最後にこのような処理を入れました。すると、 1.2+3.4=4.6 うん、いい感じです。 でも、0.9秒かかります。これは少し遅いです。 {magclick} /*========================================================*/ さいごに /*========================================================*/ 新C言語使いにおくるチョー基本講座 第10回。 絶対に解決しないと思われていた問題が、朝起きて、ぱっと解決 することは、良くあることです。 今回も、その法則で解決しました。 プログラムはやっぱり、すっきりした頭で行うのがベストです。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は6月25日(金曜日)に、第466回をお送りします。 お題は「10進変換の高速化」 10進数変換処理の遅さが目立ちます。 少し改善しましょう。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 台風で雨が降ることだよ。 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |