- - PR -
四捨五入
«前のページへ
1|2|3|4|5
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-30 21:39
そうですね〜。昔の言語は、おおらかだった・・・。大体、あってればいいやみたいな。 | ||||||||||||
|
投稿日時: 2003-07-31 00:19
ええ、64ビット浮動小数点型は32ビット整数型より広い範囲の整数を 正確に表現できますから、 64ビット整数型が存在しない言語で大きな整数を扱う必要がある場合に 64ビット浮動小数点型を代替として使用することに異論はありません。 しかし、その場合でも小数演算はできる限り避けるべきです。 たとえば以下のコードでは整数演算のみで四捨五入を計算できています。
# もちろん、上の例はC#のものなので、double -> long にしたほうが良いですが。
C#やVB.NETならdecimal型があるので、 とりあえずfloat, double型は原則禁止にしておいても あまり不都合はないですね。 | ||||||||||||
|
投稿日時: 2003-07-31 08:28
……違います。
というのは、10進数を10進数として格納するから、有効桁数を超えない範囲では誤差が出ないという意味です。 それに対し、10進数を2進数として格納する場合、2のn乗およびそれの組み合わせで表せる範囲は誤差が出ないのですが、そうでないと簡単に誤差が出ます。 たとえば、10進数ではきりのいい 0.1 なんてどうでしょう。 これを2進数に変換すると循環小数になってしまい、10進数の0.1を誤差なく格納することはできません(指数部が10進数なら別ですが)。ただし近似値にはなります。 ちょっと計算が面倒くさかったので どこかから拾ってきた数字ですが、 0.1[10進]→0.00011001100110011001100……[2進] となるようです。 10進数を10進数として格納する場合、たとえば有効桁数が3桁でも、0.1をそのまま0.1として格納します。 で、これだけなら良いように見えますが、欠点も大きいです。私の記憶では、だいたい次の欠点がありました。
[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2003-07-31 08:33 ] | ||||||||||||
|
投稿日時: 2003-07-31 11:53
% 演算は double 型には適用できなかったような… tmp = Math.Floor(tmp / 100000) * 100000; かな? #100000 で割っても整数部には誤差がでないはずです(有効桁数の範囲内なら)。
おおらかだったのは言語ではなくてユーザーですね。確かに BASIC が流行っていた頃は誤差なんて気にする人はほとんどいなかったように思えます。 #でも、研究で FORTRAN とかを使っていた人は昔から誤差に敏感だったかも。 | ||||||||||||
|
投稿日時: 2003-07-31 12:27
[quote]
ぢゃん♪さんの書き込み (2003-07-31 08:28) より: ……違います。 [quote] 失礼!。あんまり本気にしないで〜。 | ||||||||||||
|
投稿日時: 2003-07-31 14:26
C#では double 型にも % 演算がありますよ。 http://www.microsoft.com/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_7_7_3.asp ですから、上のコードはちゃんとコンパイルでき、意図したとおりに動作します。 | ||||||||||||
|
投稿日時: 2003-07-31 15:59
うわ、ほんとだ。これは失礼しました。 #実数型に剰余演算子がある言語は少ないので、思いこみで書いてしまいました。 |
«前のページへ
1|2|3|4|5