No.3ベストアンサー
- 回答日時:
計算機は2進数で計算していることはご存知ですね?
小数点以下も同じく、2進数で計算します。
本当は、小数点以下は、IEEE形式と呼ばれるもので表現しているので、かなりちがうのですが、簡単のために一般的な2進数表記で少数以下をあらわしてみましょう。
10進数の0.1は10の-1乗ですね。
当然ですが、2進数でも同じ考え方をします。
2進数の0.1は2の-1乗です。 2の-1乗はいくらでしょう?0.5ですね。
同じく、2進数の0.01は2の-2乗なので0.25です。以下0.125, 0.0625,0.03125,....となります。
ここで、10進数の0.1は2進数ではいくらか考えてみましょう。
0.1=0.0625+0.03125+....となって、循環小数になってしまいます。
あなたのご質問に戻ると、このように、2進数の少数形式でいったん内部で保持されてから、計算するので、10進では起こらなかった誤差というものが生じてしまうのです。
10進でぴったりあらわされるからといって、計算機の中でちゃんとぴったりとあらわされているとは限らないということです。
奥が深いんですね。
簡単な足し算なのになぜ?って思ってましたが、2進数で小数を表現するときの問題だったんですね。
Windowsに付属している「電卓」ではちゃんと表示されるということは、何か特別な計算方法があると考えて良いのでしょうか?
もしご存知でしたら教えてください。
ありがとうございました。
No.8
- 回答日時:
>>しかし2を何回掛けても整数になりません。
>この部分が良くわかりませんでした。
言葉足らずでした、ごめんなさい。
2.11に2を何回掛けても整数にならない。という意味です。
2を何回掛けても整数にならないので、途中で少数部分を切り捨てて、
整数×2の?乗 という形にします。そこで誤差が出ます。
VBScriptならFormat関数の代わりに
FormatNumber(a+b,2)
として下さい。
ありがとうございます。
やはり小数には誤差があることを意識して
FormatNumber(a+b,2)
のように書いておかないといけないのですね。
今まで全く意識していませんでしたので、参考になりました。
No.7
- 回答日時:
No3です。
>Windowsに付属している「電卓」ではちゃんと表示されるということは、何か特別な計算方法があると考えて良いのでしょうか?
ほかの方もおっしゃっていますが、単に有効桁数が決めてあるだけだと思いますよ。
昔、Pentiumのバグで小数点以下を使った掛け算の結果がおかしくなるというものがあったので、CPUとアプリの相互関係で決まるとおもいますが。
ちなみに。
どうしても、誤差がほしくないなら、10進数の演算プログラムを作ればよいのです。
その場合は、一般的には、配列を使います。
0~9までの数値を一つの配列に入るようにして、繰り上がり繰り下がりなどを実装すれば、メモリの許す限り何桁でも演算できます。
Superπなどが有名ですね。
ありがとうございます。
10進数の演算プログラムですか・・・
最初に配列に格納する時に、誤差が入りそうな気がします。
ちょっと大変そうですね。
Pentiumのバグの話、参考になりました。
そんな事があったとは知りませんでした。
No.6
- 回答日時:
誤差の話は皆さんがしていますので、ちょっと話を変えて、質問者様が小数点以下何桁を望んでいるかで、処理のしようがあると思います。
例えば、#2さんの言うようなFormatを使う方法もありますし、それ以外にも丸めてしまう方法もあります。
例えば5桁欲しければint(n*100000)/100000って感じ。
ありがとうございます。
教えて頂いた形で次のようにやってみました。
Int(-2.18*100)/100 + Int(2.11*100)/100
でも結果は期待した答えにはなりませんでした。
Fix(-2.18*100)/100 + Int(2.11*100)/100
でも試しましたが、やはり期待した答えにはなりませんでした。
No.5
- 回答日時:
> 普通の足し算なのになぜでしょう?
この場合は引き算になりますし、-0.07って数を扱う時に、0.0000000000000003程度のズレは普通問題にしません。
表示上困るのなら、No.2さんのように表示桁数を制御します。
700兆円とかの金額を扱うのに、3円ズレて困るのは銀行くらいです。
銀行では、もちろんお金の計算にVBScriptだとかを使う事は無いです。
--
> どこから出てきたのでしょう?
厳密な説明は出来なくは無いですが、こちらのIEEE 754などの前提知識が必要です。
こちらの丸め誤差とかの説明。
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.s …
Wikipedia - 浮動小数点
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …
「普通問題にしません」って言われても、問題としているので質問させて頂きました。申し訳ありません。
教えて頂いたサイトは参考になりました。
まだ内容を全て理解できていないので、少しずつ進めていきたいと思います。
ありがとうございました。
No.4
- 回答日時:
#2です。
誤字があったので訂正します>多少の算誤が出る
多少の誤差が出る
ついでなのでもう少し解説。
たとえば2.11という少数を整数×10の?乗と表現するとします。
10を2回掛ければ整数になります。
よって 211×10の-2乗 とかけます。
コンピュータ内部は2進数なので整数×2の?乗と表現しようとします。
しかし2を何回掛けても整数になりません。
途中であきらめることになるので、誤差が生まれます。
>しかし2を何回掛けても整数になりません。
この部分が良くわかりませんでした。
2×1=2
2×2=4
整数になるように思いますが、私の勘違いでしょうか?
誤差が出るということは、理解したつもりです。
ありがとうございます。
No.2
- 回答日時:
コンピュータ内部では2進数で計算しています。
10進数を2進数に変換するときに、多少の算誤が出る場合があります。興味があれば「浮動小数点」について調べてください。Format関数で書式を設定すれば期待通りの答えになります。
Dim a As Variant
Dim b As Variant
a = -2.18
b = 2.11
MsgBox Format(a + b, "0.##") ’有効数字小数点以下2桁
ごめんなさい。VBScriptなのでFormat関数は使えませんでした。
でもNo4の回答をもらい、少し分かったような気がします。
ありがとうございました。
No.1
- 回答日時:
-7.00000000000003E-02
↓
-7.00000000000003×10のマイナス2乗
↓
-0.0700000000000003
ですのであっています。
コンピュータは有限のメモリで連続した数値を扱うので、常にこういう誤差を持ちます。
10÷3=3.3333333333333333
とかで切っちゃうのと同じ理由です。
この回答への補足
E-02 は 10のマイナス2乗を掛ける意味ですね。
では、その前の「3」はどこから出てきたのでしょう?
Windowsに付属している「電卓」ではちゃんと「-0.07」となるのですが、VBScriptでは無理なのでしょうか?
10÷3が3.3333333333333333となるのは、「電卓」でも同じ結果なので納得できるのですが、普通の足し算なのになぜでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 空白のセルを変更しようとした時(アクティブセル)に インプットボックスを5回出す インプットボックス 1 2023/03/14 11:01
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Access(アクセス) ExcelのVBAコードについて教えてください。 4 2023/01/20 09:44
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.net Double と...
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
10進数での「25」が2進数では「...
-
Log関数に関する質問
-
100桁の計算ができなくて困って...
-
16進数 加算 減算 C言語
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
”/”を使わずに割り算したいんで...
-
EXCELの関数"STDEV(標準偏差)"...
-
マイコン(AVR)で、ある式を記...
-
C言語でセルオートマトンを作成...
-
powf を使わずにべき乗を計算
-
浮動小数点演算を固定小数点演...
-
10次の多項式を求めるプログラ...
-
符号付整数の演算結果を答えよ ...
-
定数の定義方法 #define
-
0~2πの範囲を十等分して…
-
-2.18+2.11=-7.00000000000003E...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
16進数 加算 減算 C言語
-
c languageで 簡単な質問があ...
-
VB.net Double と...
-
”/”を使わずに割り算したいんで...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
除算を使わずに10で割りたい。
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
VBAでミリ秒まで出力する方法
-
100桁の計算ができなくて困って...
-
2進数の足し算(C言語)
-
VB6.0での小数点の扱いについて
-
VBAでの割り算の余りの求め方
-
BCD・HEX・BINについて
-
距離から緯度経度を求める方法
-
コンピューターは指数関数をど...
おすすめ情報