以前に「-2.18+2.11=-7.00000000000003E-02 ?」で質問させて頂きました。
その時に、浮動小数点型のため、必ず誤差があるとの回答をもらいました。
今回は、前回と同様にVBScriptにて計算をしたのですが、誤差が出ていないように見えます。
誤差が出る時と出ない時の条件のようなものがあるのでしょうか?
それはどのような条件なのでしょうか?
使用したコードは以下のとおりです。
Dim a
Dim b
a = -2.15
b = 2.11
MsgBox (a + b)
(前回は「-2.15」の部分を「-2.18」としていました。)
ご存知の方がいらっしゃいましたら、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
> 必ず誤差があるとの回答をもらいました。
ただし、整数やきちんとIEEE754で表現できるものは除きます。
今回の場合も誤差は出ているが、誤差の範囲が倍精度浮動小数で表せる15桁より小さいので、15桁以下の値を切り捨てた結果としてそういう風に見えています。
丸め誤差は、計算のときに出るのではなく、
> a = -2.15
> b = 2.11
の時点、数値をコンピュータのメモリに格納した際に発生します。
逆に、a=-2.15000000000001とか-2.150000000000005にすると、0.00…001の誤差が出るはずなのに、出たり出なかったりすると思います。
--
例えると、
1ドル=118.07円で、手数料などは考えずに、円建てとドル建てで30000円-20000円の計算をします。
20000円=20000/118.07=169.3910392…=169ドル39セント
30000円=30000/118.07=254.0865588…=254ドル08セント
30000円-20000円=10000円
254ドル08セント-169ドル39セント=84ドル69セント=84.69×118.07=9999.3483=9999円34銭=9999円
1円どこかに行っちゃいました。
最初にドル建てに直した時点で、1セント以下の金額って無いので、丸め誤差が出ます。
最後に円建てに直す際にも、1銭以下の金額は無いので、丸め誤差が出ます。
とか?
※この場合は誤差の出る方向がそれぞれ逆のハズなので、相殺の結果マイナスになってるハズですが。
そうなんですね。計算結果だけではなく、変数に値を入れた時から誤差との戦いが始まっているんですね。
「例え」の円建てとドル建ての話、参考になりました。
ありがとうございました。
No.4
- 回答日時:
前回も解答した者です
>必ず誤差があるとの回答をもらいました。
ではなく、厳密には、誤差が出る場合がある。です。
>誤差が出ていないように見えます。
そう見えるだけで、誤差は出ています。
誤差が出ていても、その誤差が切り捨てられて、結果誤差が無いように見える場合も有ります。
今回の数式も誤差はありますよ。
>誤差が出る時と出ない時の条件のようなものがあるのでしょうか?
厳密な条件を知るには、コンピュータの内部表現や計算順序を詳しく知る必要が有り、不可能に近いと思います。
誤差が出る可能性を考慮して、必ずFormatNumberやRound関数など使うようにしましょう。
今まで何とも無かった計算式の部分で、突然指数表記が出てきてびっくりしてしまいました。
色々な数値を入れて試したのですが、指数表記になる時とならない時の条件がわからす、苦しんでいます。
やっぱり、厳密な条件を知るのは不可能なんですね。
ありがとうございました。
No.2
- 回答日時:
そもそも浮動小数点では2.15をを誤差なく保持できていません。
2.15は2.14965820625に誤差が出ています(2進15桁くらいでしか計算していないので桁を増やせばもっと2.15に近くなります)
このように浮動小数点を2進で表した誤差が、足し算の誤差にも現れます。
参考URL:http://e-words.jp/w/E4B8B8E38281E8AAA4E5B7AE.html
なんだか浮動小数点て「使えないなぁ」と思ってしまいますね。
固定小数点だと、計算に時間がかかると聞いたことがあります。
でも誤差が出ないのなら、そっちの方が良いですね。
ありがとうございました。
No.1
- 回答日時:
誤差が無いように見えるだけで、以前と同じように表記すると「-2.15+2.11=-4.00000000000000E-02」ということになり、最後の"0"以降に誤差を含んでいます。
浮動小数点型は、こういうものだと認識したほうが宜しいです。
Dim a as Float とか、
Dim a as Double とか、
浮動小数点型の使用バイト数を変化させると、"00000000000000E-02" の数値(誤差?)が変化する可能性があります。
素早い回答ありがとうございました。
やはり他の方も言われていますが、誤差はあるが見えない(場合がある)と認識して計算式を組み立てるしかなさそうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- 物理学 移流熱拡散方程式の解き方 フーリエ変換 1 2022/08/15 15:25
- その他(プログラミング・Web制作) Excel の判定式で正しく判定されない場合があります。 2 2022/05/31 14:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- 数学 至急!次の問題を教えてください。 ある市では、消防車の出動要請が平均して1時間当たり1回ある。 多く 2 2022/11/18 20:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
2進数の足し算(C言語)
-
16進数 加算 減算 C言語
-
fortranでx=1としても0.9..が入る
-
除算を使わずに10で割りたい。
-
三角比の俯角の計算
-
Double型について
-
符号付整数の演算結果を答えよ ...
-
計算が合わない
-
100桁の計算ができなくて困って...
-
VB.net Double と...
-
C言語プログラミングにて、arct...
-
C言語の実数演算の速度は、値に...
-
C言語 型変換のタイミング
-
【C++】double の計算結果がお...
-
VBAでの割り算の余りの求め方
-
2進数、16進数、10進数のことを...
-
多桁計算
-
2の補数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
三角比の俯角の計算
-
c languageで 簡単な質問があ...
-
16進数 加算 減算 C言語
-
ExcelでPC(パソコン)によって...
-
VB.net Double と...
-
”/”を使わずに割り算したいんで...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
floatの有効桁数
-
三菱シーケンサ(Aシリーズ)で...
-
距離から緯度経度を求める方法
-
VBAでミリ秒まで出力する方法
-
EXCELの関数"STDEV(標準偏差)"...
-
除算を使わずに10で割りたい。
-
C言語プログラミングにて、arct...
-
VB6.0での小数点の扱いについて
-
VBAでの割り算の余りの求め方
-
255の2の補数、B'00000001'が-...
-
変換指定子%22-16gの表示...
おすすめ情報