C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 余剰関数Modについて


(過去ログ 67 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■38770 / inTopicNo.1)  余剰関数Modについて
  
□投稿者/ けい (1回)-(2009/07/24(Fri) 18:14:10)

分類:[.NET 全般] 

こんにちは。
お世話になります。
XPPro、VB.NET2003を使用しております。
CDblとModを使って、あるコードを書いていたところ、原因不明の現象が出てきてしまいました。以下、例を挙げます。

(例)
820 Mod 5 = 0
Cdbl(8.10) * 100 Mod 5 = 0
Cdbl(8.15) * 100 Mod 5 = 0
Cdbl(8.20) * 100 Mod 5 = 4.99999999999989
Cdbl(8.25) * 100 Mod 5 = 0
Cdbl(8.30) * 100 Mod 5 = 1.13686837721616E-13
Cdbl(8.35) * 100 Mod 5 = 0
Cdbl(8.40) * 100 Mod 5 = 0
Cdbl(8.45) * 100 Mod 5 = 4.99999999999989
Cdbl(8.50) * 100 Mod 5 = 0
Cdbl(8.55) * 100 Mod 5 = 1.13686837721616E-13
Cdbl(8.60) * 100 Mod 5 = 0
Cdbl(8.65) * 100 Mod 5 = 0
Cdbl(8.70) * 100 Mod 5 = 4.99999999999989
Cdbl(8.75) * 100 Mod 5 = 0
Cdbl(8.80) * 100 Mod 5 = 1.13686837721616E-13
Cdbl(8.85) * 100 Mod 5 = 0
Cdbl(8.90) * 100 Mod 5 = 0
Cdbl(8.95) * 100 Mod 5 = 4.99999999999989

以上のような感じです。本来であれば、すべての式で0になると思うのですが。
CdblをCsngでやっても、すべて0にはなりませんでした。
また、すべての式で0にする方法があれば、知りたいと思っております。

どなたかお分かりの方がいらしたら、ご教示下さい。
よろしくお願い申し上げます。


















引用返信 編集キー/
■38772 / inTopicNo.2)  Re[1]: 余剰関数Modについて
□投稿者/ 魔界の仮面弁士 (1160回)-(2009/07/24(Fri) 19:00:33)
No38770 (けい さん) に返信
> CDblとModを使って、あるコードを書いていたところ、原因不明の現象が出てきてしまいました。

ヘルプで『Mod 演算子 (Visual Basic)』の「浮動小数点の不正確性」の項に、その理由が書いてありますよ。
http://msdn.microsoft.com/ja-jp/library/se0w9esz.aspx


> CdblをCsngでやっても、すべて0にはなりませんでした。
Double 型や Single 型は、浮動小数点型と呼ばれる型です。
これらは小数値を「2 進数」で保持している関係上、格納された数値は近似値となります。

10進数では「10÷3」の結果が無限小数になってしまう事はわかりますよね。
3進数なら誤差無く表現できますが、10進数では表現しきれません(桁数を無限に用意しない限りは)。

それと同様、2進表現である浮動小数点型では、0.10(1÷10)や 0.20(1÷5)を正しく表現出来ません。
0.5(1÷2)や 0.25(1÷4)といった値であれば誤差無く格納できますけれどね。


今回の場合は、Double 型(CDbl 関数)ではなく、Decimal 型(CDec 関数) を使ってみてください。
Decimal 型は 10進型であるため、「1÷3」のような値は、流石に表現しきれませんが、
今回の例にあるような 8.30 といった値であれば、誤差無く処理出来る筈です。
引用返信 編集キー/
■38777 / inTopicNo.3)  Re[1]: 余剰関数Modについて
□投稿者/ Jitta on the way (357回)-(2009/07/24(Fri) 21:10:11)
No38770 (けい さん) に返信
> こんにちは。
> お世話になります。
> XPPro、VB.NET2003を使用しております。
> CDblとModを使って、あるコードを書いていたところ、原因不明の現象が出てきてしまいました。以下、例を挙げます。
>
> (例)
> 820 Mod 5 = 0
> Cdbl(8.10) * 100 Mod 5 = 0
> Cdbl(8.15) * 100 Mod 5 = 0
> Cdbl(8.20) * 100 Mod 5 = 4.99999999999989
> Cdbl(8.25) * 100 Mod 5 = 0
> Cdbl(8.30) * 100 Mod 5 = 1.13686837721616E-13
> Cdbl(8.35) * 100 Mod 5 = 0
> Cdbl(8.40) * 100 Mod 5 = 0
> Cdbl(8.45) * 100 Mod 5 = 4.99999999999989
> Cdbl(8.50) * 100 Mod 5 = 0
> Cdbl(8.55) * 100 Mod 5 = 1.13686837721616E-13
> Cdbl(8.60) * 100 Mod 5 = 0
> Cdbl(8.65) * 100 Mod 5 = 0
> Cdbl(8.70) * 100 Mod 5 = 4.99999999999989
> Cdbl(8.75) * 100 Mod 5 = 0
> Cdbl(8.80) * 100 Mod 5 = 1.13686837721616E-13
> Cdbl(8.85) * 100 Mod 5 = 0
> Cdbl(8.90) * 100 Mod 5 = 0
> Cdbl(8.95) * 100 Mod 5 = 4.99999999999989
>

小数点以下二桁の数字を100倍するのだから、この時点で整数になっているはず…ということですかね?

CInt(Cdbl(8.95) * 100) Mod 5

意図は、このようにコード化することで、達成されます。



あと、「剰余」だったかと。
引用返信 編集キー/
■38822 / inTopicNo.4)  Re[2]: 余剰関数Modについて
□投稿者/ けい (2回)-(2009/07/25(Sat) 14:42:49)
魔界の仮面弁士様、Jitta on the way様、
大変勉強になりました。助かります。ありがとうございました。
早速、やってみます^^。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -