掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
1.0365の2乗を正しく計算するには? (ID:147537)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 上記は、a と b をそれぞれ 100 回ずつ足している処理です。 失礼しました。100 回ではなく 1000 回ですね、訂正しておきます。 》Aoiさん > 1.0365の2乗を計算したいのですが… 「2乗」などのように、自然数が入る分には、 1.0365 * 1.0365 などで乗り切れますが、 小数の場合はそうもいきませんしね…。 先の回答にも書いたように、残念ながら「^ 演算子」の結果は Double 固定ですし、Math クラスや Decimal クラスにも、 Decimal 精度でのべき乗演算メソッドは有していません。 数式を組み替える事でべき乗計算せずに済ませられないか検討してみてください。 その上で、どうしても精度が必要な場合は、自分で算出することになるでしょう。 http://okwave.jp/qa/q144547.html http://keisan.casio.jp/has10/SpecExec.cgi 》Miraさん > VBの場合は格納する変数の型さえDecimalにしていれば気にしなくていい^^; > と考えていいのではないでしょうか それは違うと思いますよ。最初の回答で、ZEN さんも、 >> 例えばDoubleで計算したものをDecimalにしていませんか? と書いていますよね。 たとえ Object 型で受け取ろうとも、演算結果が Double である以上、 その Object が、Double 値を示しているという事実は変わりませんし、 Decimal で受けても、Double 値として演算されている点は一緒です。 そして Double は、0.50 や 0.25 といった値ならば誤差なく格納できるものの、 0.1 や 1.07433225 は近似値としての扱いになってしまう数値型です。 確かに、二進小数な Double に比べ、Decimal は十進小数なこともあり、 我々が普段扱う値に近いのは Decimal の方と言えます。そのため、誤差を含んだ値を Decimal 変換すると、求める値に近い値となることも少なからずありますが、 それをもって「気にしなくていい」というのは、ちょっと乱暴すぎるかと。 Miraさんのコードでは、確かに A1B1D や A2B2D が 1.07433225 になりますが、 それは丸め処理によって、たまたま期待値と同じ結果が得られたということです。 今回の処理では、演算処理の時点で Double として誤差を含んでしまっている以上、 最後に Decimal に変換するだけでは、必ずしも誤差を排除できるとは限りません。 次の処理を見てください。 Dim r As Double = 1.0743322499999999R 'Dim r As Double = A1 ^ B1 Dim x As New Decimal(r) 'Dim x As Decimal = r Dim y As Decimal = Decimal.Parse(r.ToString("R", Nothing)) Dim z As Decimal = Decimal.Parse(r.ToString("G", Nothing)) この場合の実行結果は、 x = 1.07433225 y = 1.0743322499999999 z = 1.07433225 となります。 Miraさんのコードの A1B1D や A2B2D の値というのは、 上記でいうところの x の値に相当しています。 もしも r の値が、「1.07433225 の格納誤差」なのだとしたら、 確かに x の値は正しい値であるかのように見えますね。 しかし r の値が、本当に「1.0743322499999999」なのだとしたら、 誤差なく変換できているのは、y の方ということになってしまうわけです。 「^ 演算子」が Double 型の精度である以上、本当に求めていた値が 1.0743322500000000 なのか 1.0743322499999999 なのかは、演算結果からでは 保証できないわけですから、後から Decimal 化すれば済むという話にはなりません。 大変かもしれませんが、計算後の事後対応ではなく、入力値や演算段階での対処が望ましいかと。 # この話は、x と y いずれの Decimal 型変換処理が正しいのかを # 論じているわけではない事に注意してください。 # 計算処理を行ってから Decimal に格納するのでは意味が無く、そもそもの # 計算結果に十分な精度をもたせることを保証するべきである、という話です。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.