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

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

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

Re[48]: 四捨五入でバグ発見 [2]


(過去ログ 49 を表示中)

[トピック内 65 記事 (41 - 60 表示)]  << 0 | 1 | 2 | 3 >>

■26932 / inTopicNo.41)  Re[29]: 四捨五入でバグ発見
  
□投稿者/ なちゃ (189回)-(2008/10/23(Thu) 10:03:39)
あ、ごめんなさい忘れてました…

微妙に不安と書いたのは、算術関数の精度がどの程度保証されてるかに自信がないからです。

10の何乗って人間にはきれいな数値になるのは当たり前ですが、
果たしてPowが期待通りの結果を返すのか私には分かりません。
これは浮動少数の表現上の誤差の話ではなくて、この関数の実装・仕様がどうかという話です。

関数が保証する必要のある精度も浮動少数の規格で決まってた気もするんですが、ちょっと思い出せません。

引用返信 編集キー/
■26934 / inTopicNo.42)  Re[30]: 四捨五入でバグ発見
□投稿者/ みきぬ (172回)-(2008/10/23(Thu) 10:13:44)
No26932 (なちゃ さん) に返信
> あ、ごめんなさい忘れてました…
> 
> 微妙に不安と書いたのは、算術関数の精度がどの程度保証されてるかに自信がないからです。
> 
> 10の何乗って人間にはきれいな数値になるのは当たり前ですが、
> 果たしてPowが期待通りの結果を返すのか私には分かりません。
> これは浮動少数の表現上の誤差の話ではなくて、この関数の実装・仕様がどうかという話です。
> 
> 関数が保証する必要のある精度も浮動少数の規格で決まってた気もするんですが、ちょっと思い出せません。
> 
返信ありがとうございます。

Math.Pow() がどの場合でも期待通りの結果を返すかはわかりませんが、
10の整数乗については信用してもいいんじゃかなーと思います。

とりあえずこんなコード書いて実行したのですが、とくにおかしな結果とは思いませんでした。

For i As Integer = -100 To 100
    Console.WriteLine("10 ^ " & i & " = " & Math.Pow(10, i))
Next

# ちなみに、VB で ^ 記号つかってべき乗したものを MSIL でみると、Math.Powになってました…アホなこと書いてしまった。

引用返信 編集キー/
■26945 / inTopicNo.43)  Re[29]: 四捨五入でバグ発見
□投稿者/ Jitta (526回)-(2008/10/23(Thu) 12:17:53)
2008/10/23(Thu) 12:18:30 編集(投稿者)

No26931 (みきぬ さん) に返信
> 本題とは関係ないけど、No26786の疑問に対してどなたか解説してくれるとうれしいかなぁ、なんて思ったり。
> -----
> あれ、リンクにならない。…なんでだろ?

スペースあけれ


> 本題とは関係ないけど、 No26786 の疑問に対してどなたか解説してくれるとうれしいかなぁ、なんて思ったり。

引用返信 編集キー/
■26955 / inTopicNo.44)  Re[30]: 四捨五入でバグ発見
□投稿者/ ま (142回)-(2008/10/23(Thu) 18:53:05)
Decimal って128 ビットだったの?メモリ許す限り桁かと思っていた・・・

CPU 特有のやつで、long double ってのがあるけど。BCD 演算する 10 バイトのやつ。
これなら、Decimal より超高速で動くよ。たぶん double と変わらないんじゃない?
専用レジスタも8個だか16個だかあるし。C# からどうやったら参照できるのかは知らんけど;;





引用返信 編集キー/
■26969 / inTopicNo.45)  Re[31]: 四捨五入でバグ発見
□投稿者/ y4yama (80回)-(2008/10/24(Fri) 08:17:09)
doubleとの比較があるので・・・蛇足ながら・・・

>私のような「doubleの特徴をほとんど分かっていない人」が一人でも
>プロジェクトに混ざっているかもしれない「会社やグループ」の場合は
>ソフトによらず標準としてdecimalでも良いのではないかとおもったりしてます

よねKEN さんの回答を補足する形ですが。
三角形の斜辺の長さを求めるには、Math.Sqrtを使う、とかsin,cosの計算でもですが
decimalでなく、double で計算されます。
だから、decimalを混在させるのは混乱のもとです。ソフトによっては、標準としてdouble を使うのではないでしょうか?
引用返信 編集キー/
■26970 / inTopicNo.46)  Re[31]: 四捨五入でバグ発見
□投稿者/ Jitta (527回)-(2008/10/24(Fri) 08:40:03)
No26955 (ま さん) に返信
> Decimal って128 ビットだったの?メモリ許す限り桁かと思っていた・・・
>

http://msdn.microsoft.com/ja-jp/library/364x0z75.aspx
引用返信 編集キー/
■26973 / inTopicNo.47)  Re[31]: 四捨五入でバグ発見
□投稿者/ 魔界の仮面弁士 (880回)-(2008/10/24(Fri) 10:15:50)
No26955 (ま さん) に返信
> メモリ許す限り桁かと思っていた・・・
Decimal は有限桁数ですね。それ以外だと、多倍長整数型あたりかな?

整数型ゆえ、そのままでは小数を保持できませんが、
.NET 2.0 だと、J# の java.math.BigInteger クラスとか、
IronPython の IronMath.BigInteger クラスなどが相当します。

あとは、.NET 3.5 β1 で消えた System.Numeric.BigInteger とか。
(今でも System.Core.dll 内に、internal クラスとして残っているけれど)


> CPU 特有のやつで、long double ってのがあるけど。BCD 演算する 10 バイトのやつ。

そういう物があるとは知りませんでした。Intel IA-32 のコレなどがそうなのかな?

[4.7. BCD およびパックドBCD 整数]
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf

"long double" で google って拾えたもの。上記と同じ物かどうかは読み取れませんでした。
http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/server/longdouble.html
http://msdn.microsoft.com/ja-jp/library/9cx8xs15.aspx


> C# からどうやったら参照できるのかは知らんけど;;
(^_^;)
引用返信 編集キー/
■27003 / inTopicNo.48)  Re[32]: 四捨五入でバグ発見
□投稿者/ 開発サイドの人 (1回)-(2008/10/24(Fri) 13:46:10)
営業と開発の押し問答みたいだなー。
おもしろい!
引用返信 編集キー/
■27007 / inTopicNo.49)  Re[33]: 四捨五入でバグ発見
□投稿者/ PATIO (151回)-(2008/10/24(Fri) 15:45:05)
> 例外を言い出すときりがないと思いますが
> 一般論としても違うということですか?

一般論として「ソフトの中身に応じて検討しないと駄目です」ってのはないのかなぁと。
だから、ちゃんと検討しなさいって話なんですけれど。
逆にこれで大丈夫と言ってしまうとちゃんと検討する事を避けて
それで逃げてしまいそうなので怖い気がします。
「検討しないで決めるのは駄目」でも良いのでは?

引用返信 編集キー/
■27010 / inTopicNo.50)  Re[34]: 四捨五入でバグ発見
□投稿者/ Jitta on the way (198回)-(2008/10/24(Fri) 19:15:33)
最初にもどって、コードにはバグがあると言ってもいいと思うのですよ。「555.555 の、3桁目を四捨五入して2桁にしたい」とき、期待する答えは「560」ではないでしょうか(^^;
引用返信 編集キー/
■27026 / inTopicNo.51)  Re[35]: 四捨五入でバグ発見
□投稿者/ みきぬ (177回)-(2008/10/25(Sat) 06:55:09)
No27010 (Jitta on the way さん) に返信
> 最初にもどって、コードにはバグがあると言ってもいいと思うのですよ。「555.555 の、3桁目を四捨五入して2桁にしたい」とき、期待する答えは「560」ではないでしょうか(^^;

あー、つまりこの部分ですね。やっと意味がわかった。

> ''' <param name="iDigits">
> ''' 戻り値の有効桁数の精度。</param>

で、MSDNを読んでみたのですが…あれれ?

http://msdn.microsoft.com/ja-jp/library/75ks3aby(VS.80).aspx
> digits
> 戻り値の有効桁数 (精度)。

新しい版だと直っていました。
http://msdn.microsoft.com/ja-jp/library/75ks3aby.aspx
> digits
> 型 : System.Int32
> 戻り値の小数部の桁数。

結論:MSDNが悪い(ぉ
引用返信 編集キー/
■27031 / inTopicNo.52)  Re[36]: 四捨五入でバグ発見
□投稿者/ Jitta on the way (200回)-(2008/10/25(Sat) 10:16:22)
No27026 (みきぬ さん) に返信

> 結論:MSDNが悪い(ぉ

よくあることですよf^_^;


そして double に進めると、5桁しか有効桁数がない。555.555 という数値が特殊なのか?そうだとしたら、他にもそういう数値があるのか。その辺が気になります。
引用返信 編集キー/
■27035 / inTopicNo.53)  Re[37]: 四捨五入でバグ発見
□投稿者/ なちゃ (190回)-(2008/10/25(Sat) 13:56:58)
No27031 (Jitta on the way さん) に返信
> そして double に進めると、5桁しか有効桁数がない。555.555 という数値が特殊なのか?そうだとしたら、他にもそういう数値があるのか。その辺が気になります。

??
これってどういう意味でしょう?


引用返信 編集キー/
■27042 / inTopicNo.54)  Re[38]: 四捨五入でバグ発見
□投稿者/ Jitta on the way (201回)-(2008/10/25(Sat) 20:21:30)
No27035 (なちゃ さん) に返信
> ■No27031 (Jitta on the way さん) に返信
>>そして double に進めると、5桁しか有効桁数がない。555.555 という数値が特殊なのか?そうだとしたら、他にもそういう数値があるのか。その辺が気になります。
>
> ??
> これってどういう意味でしょう?
>
>

有効桁数は15桁とあります。これは、15桁目までは、期待する数値を保持するということではないでしょうか。しかし、555.5549…なら、5桁目までしか期待する数値ではありません。555.55500…を期待したいです。
引用返信 編集キー/
■27048 / inTopicNo.55)  Re[39]: 四捨五入でバグ発見
□投稿者/ なちゃ (191回)-(2008/10/26(Sun) 13:07:44)
> 有効桁数は15桁とあります。これは、15桁目までは、期待する数値を保持するということではないでしょうか。しかし、555.5549…なら、5桁目までしか期待する数値ではありません。555.55500…を期待したいです。

有効桁数というのはそういうもんじゃありません。
まあ2進10進とのからみで予測と違う動作に見えることはありますが。

切り上げ方向とか0から離れる方向への丸めしか行われなければ期待通りにはなるでしょうけど。

少なくとも、期待の数字ではないから有効桁数が5桁しかないとかそういうもんじゃありませんし、そんな数値はいくらでもあります。

引用返信 編集キー/
■27049 / inTopicNo.56)  Re[40]: 四捨五入でバグ発見
□投稿者/ なちゃ (192回)-(2008/10/26(Sun) 13:13:02)
例えばなんらかの計測数値が9.99で真値が10ちょうどのはずであるとき、
有効桁数が1桁もないなどと思う人はいないでしょう。

引用返信 編集キー/
■27050 / inTopicNo.57)  Re[41]: 四捨五入でバグ発見
□投稿者/ なちゃ (193回)-(2008/10/26(Sun) 13:20:28)
No27049 (なちゃ さん) に返信
> 例えばなんらかの計測数値が9.99で真値が10ちょうどのはずであるとき、
> 有効桁数が1桁もないなどと思う人はいないでしょう。

あっと、いや、これは例が良くないかな、基数変換の誤差だけで考えた方がいいかな…

引用返信 編集キー/
■27052 / inTopicNo.58)  Re[42]: 四捨五入でバグ発見
□投稿者/ なちゃ (194回)-(2008/10/26(Sun) 13:55:01)
表現が2進で行われるから10進で見ると桁の数字が違ってしまう場合があるが、
値自体に含まれる誤差の範囲は有効桁数より小さい桁の範囲内というか。

少なくとも誤差の範囲は10進での桁の数字を無理に合わすよりも小さいわけで。

引用返信 編集キー/
■27054 / inTopicNo.59)  Re[43]: 四捨五入でバグ発見
□投稿者/ Jitta (529回)-(2008/10/26(Sun) 22:00:01)
Jitta さんの Web サイト
No27052 (なちゃ さん) に返信
> 表現が2進で行われるから10進で見ると桁の数字が違ってしまう場合があるが、
> 値自体に含まれる誤差の範囲は有効桁数より小さい桁の範囲内というか。
>
> 少なくとも誤差の範囲は10進での桁の数字を無理に合わすよりも小さいわけで。
>

で、大元にもどります。
555.555 を、小数点以下3桁目で四捨五入し、555.56 という数値を期待した。しかし、double では 555.55499999... という数値で記録されているため、小数点以下3桁目で四捨五入すると、555.55 という数値になってしまった。これを 555.56 という数値が返ってくるように、安定して四捨五入の結果が得られるためには、どうすればいいのでしょうか。←質問者も、これが知りたいのではないでしょうか。

なぜ 555.55 になるかはわかったと思うで、そろそろ進んでもいいのでは?


パッと思ったのは、小数点以下3桁目で四捨五入なら、まず小数点以下4桁目を四捨五入しておいて、それから3桁の四捨五入を行うのかなぁ〜?
(σ(・_・)知識として誤差は知っているけど、実際に誤差で苦しんだことのない、幸せな人)
引用返信 編集キー/
■27060 / inTopicNo.60)  Re[44]: 四捨五入でバグ発見
 
□投稿者/ れい (817回)-(2008/10/27(Mon) 01:00:41)
No27054 (Jitta さん) に返信
> で、大元にもどります。
> 555.555 を、小数点以下3桁目で四捨五入し、555.56 という数値を期待した。しかし、double では 555.55499999... という数値で記録されているため、小数点以下3桁目で四捨五入すると、555.55 という数値になってしまった。これを 555.56 という数値が返ってくるように、安定して四捨五入の結果が得られるためには、どうすればいいのでしょうか。←質問者も、これが知りたいのではないでしょうか。

もうずいぶん前、最初の方に出てますが。
Decimalを使ったり、10の累乗倍を掛けた固定小数点な値を使ったり、といった方法しかないです。

> なぜ 555.55 になるかはわかったと思うで、そろそろ進んでもいいのでは?

進む必要はありません。
答えはもう出てるので。

> パッと思ったのは、小数点以下3桁目で四捨五入なら、まず小数点以下4桁目を四捨五入しておいて、それから3桁の四捨五入を行うのかなぁ〜?

その方法はだめです。
なんでダメかは…省略。
記数法と少数の関係は考えると結構面白いですよ。

引用返信 編集キー/

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

管理者用

- Child Tree -