メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.465) 四捨五入  2004/06/23


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。