メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.464) 少数変換デバッグ  2004/06/21


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第464回 少数変換デバッグ
 発行    2004年6月21日(土曜日)
 発行数   約2900

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 前回はまぐまぐさんのサーバ不調のため、配信が遅れてしまい
ました。
 珍しく皆勤賞で来ていたのに、ねぇ。

 それはともかく、カボチで神秘の鎧が手に入るという重大ニュー
スを聞いたあゆしゃは、早速、

 結婚前夜でキープしておいた7時間30分のセーブデータで、
プレイをしなおしました。

 なれたもので、すいすいと攻略していき、いざ、カボチへ! と
したとき。

★カボチのどこにも、宝箱おじさんがいない! なぜ?

/*========================================================*/
 株日記
/*========================================================*/

野村のバーチャル株式投資倶楽部
http://www2.nomura.co.jp/vstock/VirtualServlet?
(ゲストでログインして Ayusya を探せば成績を参照できます)

★ここ一週間の Ayusya の成績
月曜日 1,000,001円です。(22,925番/92,591人中)
火曜日 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人中)

 おおぉぉぉぅ、上がっているぅぅ。。。。!!

 株って面白いぃ〜E!! ね?

 どうも、ゴールデン買いが功を奏したようです。

 内海造船、2万円の元手で+2000円! すごい!

 それにしても、スクエニ、売るのが早すぎたと後悔しています。

 今ぐらい(日曜日現在)に売るべきでしたね。

{magclick}
/*========================================================*/
 今回のお題  << 少数変換デバッグ >>
/*========================================================*/

 さて、できたものを早速動かしてみました。

 1.2+3.4の結果が、変でした。

1.2+3.4=4.00000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000006247690015624382322230482640011
856134605011717689015834446091547121395669534766973829427703
000904518178369616112966241616671811938792706981787096020728
7321965858(略)

 下位桁はともかく、上位桁は 4.6 ぐらいになって欲しいです。

 なんでかなぁ、と、少し調べると、どうも小数部のサイズを
変えることによって、いい場合と悪い場合があるようでした。

 230バイトぐらいが限界のようです。

1.2+3.4=4.59999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999(略)

 230にすると、それっぽい計算結果になりました。

 240バイトだと256バイトと同じ結果で、駄目です。

 なぜでしょうか?

 少し調べましたが、良くわかりませんでした。

 もう少し調べましたが、良くわかりませんでした。

★ひょっとして私は馬鹿なのでしょうか?

 そんなことはありえません。(<危険思想)

 どうも fromString と勝手ににらみ、その計算途中のバッファを
ロギングして、ざー! を実行してみました。

CXInt& CXInt::fromFloatString( CString st )
{
    int pos = st.Find( "." );
    if( pos > 0 ) {
        fromString( st.Left( pos ) ); // 整数部を取得
        shlByte( SMALL_SIZE ); // 小数部をあける
        CXInt a;
        st = st.Mid( pos + 1 );
        int len = st.GetLength();
        if( len > SMALL_BIT_SIZE )
            st = st.Left( SMALL_BIT_SIZE );
        else if( len < SMALL_BIT_SIZE )
            st += CString( '0', SMALL_BIT_SIZE - len );
        a.fromString( st );

        a.debugOut( "fromString " + st ); // 追加!

        a.shlByte( SMALL_SIZE );

        a.debugOut( "shlByte" ); // 追加!

        a.div( CXInt().fromString(
            "1" + CString( '0', SMALL_BIT_SIZE ) ) );

        a.debugOut( "div" ); // 追加!

        memcpy( m_buff, a.m_buff, SMALL_SIZE ); // 小数部に
    }
    else fromString( st );
    return *this;
}

// この関数をためしに作成
void CXInt::debugOut( LPCTSTR name )
{
    FILE* fp = fopen( "CXIntlog.txt", "at" );
    if( fp ) {
        fprintf( fp, "%s\n", name );
        for( int i = SIZE - 1; i >= 0; i-- ) {
            fprintf( fp, "%02X", ( UCHAR )m_buff[ i ] );
        }
        fprintf( fp, "\n" );
        fclose( fp );
    }
}

 1.2+3.4=を実行した結果、

(1.2 と 3.4 をそれぞれ fromFloatString した場合)

/*========================================================*/

失敗(SMALL_SIZE=240、SMALL_BIT_SIZE=1920時)

fromString 200000000000...(2+'0'*1919)
00000000..(省略=0*60*7行)..000000000000000000000000000000
0000000000000000000000000000000000DBCB7E721270007AC6C6038BF0
76317FCAA5FF49CEEB80E2D10C7279406E24FDC20B1AB608BED0AF27F9FB
D3F8F99F425BBEF16C314426E845704FB24357D2E299A5F5558DEB8DE254
A68DB543D26706AE8ABA3996811885FD453BE46A5A22214DCD2719C58FD7
A781BEF35AE121F9F61574CA2F147EAAC9E4A83FBC5CDB7FD9EC851B207A
37B36DE3FD8CA6372354E1ADAD4C4928F72F52DCACD95DA2EACE9AC3E4F2
E3F0AE967E8FACDA6B8D7761026806C80A91723859952DB9103ED4E1B339
9D34C0C806D12205FBEE360A0E8B14FCE05E9391D21E5DACE846BB7BC830
193138FE6F64AC71EB0E06534743686C8B16EAB064009272D3F36C279A3B
EDA46E3ED46406F115009D1EEFE876262D30910CB84478BC7C2367DC717C
F35CA137A461DDA0362A3EC322299B00895C51B7D7E6CF9C6B8F5C96030C
F691CD4C9F55451DF45C4B94AE96BA746A8478204EC618CF98B8FB7CFD25
329F4091950B58FFA594B97CDD2DE99BDDC7EC9A6D34035DF9D0735D024D
F3E062574D349F6F205606CB16B17AD3675200737F5E6DC7B695ECFB31A4
F1343D10401DA9D33AA82565346D02E98270F87CD77DA1253FF16D588D40
2FEB1742932E58D4D9C68ACE820CBF111EBF3EE3DBC02FECDC3D2CF41021
66568816B61D4C37ACC7CBB23585D6C04A6A903C73CECA7D453A1B730845
3020CC2CBC33EDA1FC66C443806D76D30971E6071771AC3A96FD5CF000A5
7A4C63E72FAD016AB18E1E791422BB40CBB760359C92AFC8F1F59493377C
57E086CD0000000000000000000000000000000000000000000000000000
00000000..(省略=0*60*7行)..000000000000000000000000000000
00000000
下位240ビットが0なのでそれっぽい

shlByte
上記を8行(30*8=240バイト)上にずらしたものに同じ

div
上位桁省略
00000000000000000000000000000000001B8850F78A9A19A2C859858D6C
DA18E923C346313CBFF78531E9160F1E8B379BFDD862175E40371C71CF7A
D51A2A3D73C08CF4469D34EA226B3B56381AE911E77A2ED5CAAF71876524
07DE57035D5D03AE64E81D9E47D0EB46F92A96E4FE89E04E197DBC0F465E
A47757D80A21E01AAE1C04E7A3EDF4E8683BE8394B402A6D2F6FFE78D2E4
45342A88FA15E7B6A6D61DC42F621F0B6A810F20BC96262F6BBE64887A7D
7BBC3BA1D801257E6B4FC46C5F5D915F45262FED138261A0C3105FFCB04F
1392E8444C7A37BF0792186B8ACF3AB8B1B796A96D35EA19820CEDAAE439
534B776C
あっているのかよーわからんけど。

fromString 400000000000...(4+'0'*1919)
00000000..(省略=0*60*7行)..000000000000000000000000000000
0000000000000000000000000000000001B796FCE424E000F58D8C0717E0
EC62FF954BFE939DD701C5A218E4F280DC49FB8416356C117DA15E4FF3F7
A7F1F33E84B77DE2D862884DD08AE09F6486AFA5C5334BEAAB1BD71BC4A9
4D1B6A87A4CE0D5D1574732D02310BFA8A77C8D4B444429B9A4E338B1FAF
4F037DE6B5C243F3EC2AE9945E28FD5593C9507F78B9B6FFB3D90A3640F4
6F66DBC7FB194C6E46A9C35B5A989251EE5EA5B959B2BB45D59D3587C9E5
C7E15D2CFD1F59B4D71AEEC204D00D901522E470B32A5B72207DA9C36673
3A6981900DA2440BF7DC6C141D1629F9C0BD2723A43CBB59D08D76F79060
326271FCDEC958E3D61C0CA68E86D0D9162DD560C80124E5A7E6D84F3477
DB48DC7DA8C80DE22A013A3DDFD0EC4C5A6122197088F178F846CFB8E2F9
E6B9426F48C3BB406C547D864453360112B8A36FAFCD9F38D71EB92C0619
ED239A993EAA8A3BE8B897295D2D74E8D508F0409D8C319F3171F6F9FA4A
653E81232A16B1FF4B2972F9BA5BD337BB8FD934DA6806BBF3A0E6BA049B
E7C0C4AE9A693EDE40AC0D962D62F5A6CEA400E6FEBCDB8F6D2BD9F66349
E2687A20803B53A675504ACA68DA05D304E1F0F9AEFB424A7FE2DAB11A80
5FD62E85265CB1A9B38D159D04197E223D7E7DC7B7805FD9B87A59E82042
CCAD102D6C3A986F598F97646B0BAD8094D52078E79D94FA8A7436E6108A
604198597867DB43F8CD888700DAEDA612E3CC0E2EE358752DFAB9E0014A
F498C7CE5F5A02D5631C3CF228457681976EC06B39255F91E3EB29266EF8
AFC10D9A0000000000000000000000000000000000000000000000000000
00000000..(省略=0*60*7行)..000000000000000000000000000000
00000000
下位240ビットが0なのでそれっぽい
(2+'0'*1919)と1ビット左にずれたもののはず・・・それっぽい

shlByte
上記を8行(30*8=240バイト)上にずらしたものに同じ

div
上位桁省略
00000000000000000000000000000000003710A1EF1534334590B30B1AD9
B431D247868C62797FEF0A63D22C1E3D166F37FBB0C42EBC806E38E39EF5
AA34547AE78119E88D3A69D444D676AC7035D223CEF45DAB955EE30ECA48
0FBCAE06BABA075CC9D03B3C8FA1D68DF2552DC9FD13C09C32FB781E8CBD
48EEAFB01443C0355C3809CF47DBE9D0D077D072968054DA5EDFFCF1A5C8
8A685511F42BCF6D4DAC3B885EC43E16D5021E41792C4C5ED77CC910F4FA
F7787743B0024AFCD69F88D8BEBB22BE8A4C5FDA2704C3418620BFF9609E
2725D08898F46F7E0F2430D7159E7571636F2D52DA6BD4330419DB55C872
A696EED9
.2 のときの2倍になっているのでOKっぽい

/*========================================================*/

成功(SMALL_SIZE=230、SMALL_BIT_SIZE=1840時)

fromString 2000000..(2+'0'*1839)
00000000..(省略=0*60*8行)..000000000000000000000000000000
000000000000000000000000000000000000000041273F1CF9E962254B0A
4B5E71C4BE75A21D53CEF4EA2B50BBBB58E0ACB65FFECADB240C388EBC88
B988D8E90C56BE8B2DA1C1F011DFE537235BC18CC21F8881C1BC91FC1C89
98B2807D842B24B5DAB79AA44BEA78FD6BCD0B2FE465D54EA833A4F9DFB3
95A3FF0C9D079E176047BFA660A098FF4A3BC830B21FE2583EF587DC2DE9
9A4BB1F7E8C64E10D325B15A7A8DF9A4059D632AA90615AE47851E30D80D
B99F561259F92FF98E032C3CC9E6D26A1BBDBEAF24B6B5A1F581E9690C72
1AEA7E23D1B61682D799747A5934C83DEDEC39BB19DFF9CEE73DFED2AEB2
52A04B32F0BA69C5404209650D2020233D122B3BF3E9A193CF27BB010C48
EFDD1FC77E93697995871AD940B30E7A9A1F6756F3F4888BFD8B1C353802
EBC6A53E7C01ABCEE4B1B1675234E7892A26CAF91065254BDD22E23B7463
30853F4659984FC43F74C7037ABFCA50D5315B2A8A1E07AF1B34008C76BB
5D6F2ABD443ACC0C4027C84651A815EE25EE4DFC4550A5C07181E367FE47
0632FB6B10175129F49E09D6C510962BE776AC2154BF46BD3363E364E8C0
20BAC39EDA31BB25E4476A9C6819BA582F9FDBC7082D345B6094D0DC4558
2597DFEFBBE3F452EBF45C060C9BAEF71162C7125C3E0B2D2590A2E6A4EC
CFCF2E0028689E1B694B2664186667E1EB1614AD4D78E7006DC1B6FB40A9
9CEE7D66A29929EC822B70291CDF84E61ED1D257FBFB6DECE4F20321F7BD
D1BA1183E5D2AE2CD872478AC70D00000000000000000000000000000000
00000000..(省略=0*60*7行)..000000000000000000000000000000
00000000
下位230ビットが0なのでそれっぽい

shlByte
上記を7行+40列(30*7+20=230bytes)上にずらしたものに同じ

div
上位桁省略
000000000000000000000000000033333333333333333333333333333333
33333333..(省略=3*60*7行)..333333333333333333333333333333
33333333

fromString 4000000..(4+'0'*1839)
00000000..(省略=0*60*8行)..000000000000000000000000000000
0000000000000000000000000000000000000000824E7E39F3D2C44A9614
96BCE3897CEB443AA79DE9D456A17776B1C1596CBFFD95B64818711D7911
7311B1D218AD7D165B4383E023BFCA6E46B78319843F1103837923F83913
316500FB0856496BB56F354897D4F1FAD79A165FC8CBAA9D506749F3BF67
2B47FE193A0F3C2EC08F7F4CC14131FE94779061643FC4B07DEB0FB85BD3
349763EFD18C9C21A64B62B4F51BF3480B3AC655520C2B5C8F0A3C61B01B
733EAC24B3F25FF31C06587993CDA4D4377B7D5E496D6B43EB03D2D218E4
35D4FC47A36C2D05AF32E8F4B269907BDBD8737633BFF39DCE7BFDA55D64
A5409665E174D38A808412CA1A4040467A245677E7D343279E4F76021891
DFBA3F8EFD26D2F32B0E35B281661CF5343ECEADE7E91117FB16386A7005
D78D4A7CF803579DC96362CEA469CF12544D95F220CA4A97BA45C476E8C6
610A7E8CB3309F887EE98E06F57F94A1AA62B655143C0F5E36680118ED76
BADE557A88759818804F908CA3502BDC4BDC9BF88AA14B80E303C6CFFC8E
0C65F6D6202EA253E93C13AD8A212C57CEED5842A97E8D7A66C7C6C9D180
4175873DB463764BC88ED538D03374B05F3FB78E105A68B6C129A1B88AB0
4B2FBFDF77C7E8A5D7E8B80C19375DEE22C58E24B87C165A4B2145CD49D9
9F9E5C0050D13C36D2964CC830CCCFC3D62C295A9AF1CE00DB836DF68153
39DCFACD453253D90456E05239BF09CC3DA3A4AFF7F6DBD9C9E40643EF7B
A3742307CBA55C59B0E48F158E1A00000000000000000000000000000000
00000000..(省略=0*60*7行)..000000000000000000000000000000
00000000
下位230ビットが0なのでそれっぽい

shlByte
上記を7行+40列(30*7+20=230bytes)上にずらしたものに同じ

div
上位桁省略
000000000000000000000000000066666666666666666666666666666666
66666666..(省略=6*60*7行)..666666666666666666666666666666
66666666
.2 のときの2倍になっている

/*========================================================*/

 ・・・いいじゃない。あれ?

★4時間もかけたのに!

★★あー、分からん! ポーン!(ちゃぶ台が空を飛ぶ音)


★★★★★★230でいいですか? (撃爆!)★★★★★★


{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 新C言語使いにおくるチョー基本講座 第9回。

 プログラムの動作をファイル(主にテキスト)に記録することを
ロギング(logging)といいます。

 デバッガで1行1行進めるのもデバッグですが、プログラムの
実行結果をべーっと並べて、じっくりと見比べるのも、有効な
デバッグ方法です。

 そもそもログとは丸太のことで、丸太小屋のことをログハウスと
いいますよね。

 プログラムのログも丸太小屋のように、どんどん積み重ねて出力
します。
 蓄積していくのですね。

 だから fopen は "at" (テキスト追加書き込み)となっていま
す。

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は6月23日(水曜日)に、第465回をお送りします。
 お題は「四捨五入」

 230でやるとしても、9が多すぎです。
 四捨五入を行う必要があります。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
梅雨ってなんだろう? なんて大歓迎です。

{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

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