NormalizeDoubleによるMT4での数値の丸め方 - ページ 4 1234567891011...17 新しいコメント Lilita Bogachkova 2016.02.22 09:26 #31 Dmitry Fedoseev: これは0.6だから、0.5は不正行為によってしか得られないからだ。double v1 = 1.1234567;任意の数値に「v1」が挿入されていれば、「i=2」に正しく丸められたことを示す。 Dmitry Fedoseev 2016.02.22 09:28 #32 lilita bogachkova: 任意の数値に「v1」を挿入すると、「i=2」まではすべて正しく丸められることがわかる。 i = 2 以降は間違い? Lilita Bogachkova 2016.02.22 09:34 #33 Ihor Herasko:1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なもので、1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なものです。2桁を正規化する場合、0〜49→0、50〜99→1というように2桁の数字が考慮される。結局のところ、1.49という数字を整数に丸めなければならない場合、1に対する利用可能な100分の49の距離に対して、100分の51である2を本当に得なければならないのだろうか?3桁、4桁などでも同じです。しかし、1.45は2に切り上げられるが、それは以前に1度高い精度で正規化されていた場合のみである。void OnStart() { for(int i=7;i>=0;i--) { double v1 = 1.4545454; double v2 = NormalizeDouble(v1,i+1); v1=NormalizeDouble(v1,i); v2=NormalizeDouble(v2,i); Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7)); } Print("---"); }v1 = 0 = 1.0000000, v2 = 0 = 2.0000000v1 = 1 = 1.5000000, v2 = 1 = 1.5000000v1 = 2 = 1.4500000、v2 = 2 = 1.4600000v1 = 3 = 1.4550000, v2 = 3 = 1.4550000の計算で高い精度に正規化され、その後の計算で低い精度にこの数を正規化すると、単に低い精度にこの数を正規化した場合とは異なる結果になることが判明しました。 Ihor Herasko 2016.02.22 10:16 #34 lilita bogachkova:というのは、計算時に高い精度で正規化した数値を、その後の計算で低い精度で正規化すると、ただ低い精度で正規化した場合とは異なる結果になることがわかったからです。 以上、このような行為を「ズルい」と言います))数学は厳密な科学ですが、やはり理解した上で応用しなければなりません。2+3=5 だが、バケツ2+ニワトリ3なら5は成立しない )) 削除済み 2016.02.24 08:44 #35 失礼ですが、どのようにして欲しい値を手に入れるのでしょうか?推奨機能を使えば- あるケースでは、正しく丸められた値が得られます0.06-0.02=NormalizeDouble(0.03999999999,2) =0.04 割り算は近似的で、正規化が必要です。- 2番目のケースでは、丸めも出てきますが、この場合は必要ありません0.06-0.024= NormalizeDouble(0.036,2) =0.04 ここでは正規化(丸め)は必要ありません。しかし、四捨五入ではなく、正規化するにはどうしたらいいのでしょうか? Ihor Herasko 2016.02.24 09:08 #36 Roman Starinskij:失礼ですが、どのようにして欲しい値を手に入れるのでしょうか?そのためには、「正しい価値観」とは何かを定式化することに意味があるのです))推奨機能を使えば- あるケースでは、正しく丸められた値が得られます。0.06-0.02= NormalizeDouble(0.03999999999,2) =0.04と なります。 割り算は近似的に行われるので、正規化しないとできない。- 2つ目のケースでは、丸めも発生しますが、このケースでは必要ありません0.06-0.024= NormalizeDouble(0.036,2) =0.04と なります。 ここでは正規化(丸め)は必要ありません。しかし、値を丸めるのではなく、きちんと正規化するにはどうしたらいいのでしょうか?上の例では、正規化の「正しさ」を判断する何らかの直感的なアルゴリズムを使っていることがわかります。前者では無限小数、後者では有限小数である。実数を目的の形に変換するアルゴリズムを調整する。最も簡単な方法は、事前に必要な精度を決めておくことです。 削除済み 2016.02.24 14:23 #37 Ihor Herasko:そのためには、単純に「正しい価値観」とは何かを定式化することに意味があります))上記の例から、正規化の「必要性」を判断するために、何らかの直感的なアルゴリズムを使っていることがわかります。前者では無限小数、後者では有限小数である。実数を目的の形に変換するアルゴリズムを調整する。最も簡単な方法は、必要な精度をあらかじめ決めておくことですが。今まで電卓で出していた、同じ数字が出ればいいんです。:-)これが、あなたに必要な価値観です。つまり、「0.06-0.02」では「0.04」、「0.06-0.024」では「0.036」となるわけだ。 Dmitry Fedoseev 2016.02.24 14:29 #38 Roman Starinskij: 電卓と同じ数値が出ればいいんです。:-)これが、あなたに必要な価値観です。0.06-0.02」なら「0.04」、「0.06-0.024」なら「0.036」となるのです。 0.036(小数点以下3桁)を求める場合は、小数点以下2桁ではなく、小数点以下3桁で正規化する必要があります。 削除済み 2016.02.24 17:08 #39 Dmitry Fedoseev: 0.036(小数点以下3桁)が必要な場合は、2ではなく3に正規化します。3桁までが正規化されるはずと勘違いしていました。このようなことは可能でしょうか? Dmitry Fedoseev 2016.02.24 17:33 #40 Roman Starinskij:3桁までが正規化されるはずと勘違いしていました。そのようにうまくいくのでしょうか?これがあなたのコードです。0.06-0.024 = NormalizeDouble(0.036,2) = 0.04 2の代わりに3を入れると、0.036になります。 1234567891011...17 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
これは0.6だから、0.5は不正行為によってしか得られないからだ。
任意の数値に「v1」が挿入されていれば、「i=2」に正しく丸められたことを示す。
任意の数値に「v1」を挿入すると、「i=2」まではすべて正しく丸められることがわかる。
1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なもので、1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なものです。
2桁を正規化する場合、0〜49→0、50〜99→1というように2桁の数字が考慮される。結局のところ、1.49という数字を整数に丸めなければならない場合、1に対する利用可能な100分の49の距離に対して、100分の51である2を本当に得なければならないのだろうか?
3桁、4桁などでも同じです。
しかし、1.45は2に切り上げられるが、それは以前に1度高い精度で正規化されていた場合のみである。
v1 = 0 = 1.0000000, v2 = 0 = 2.0000000
v1 = 1 = 1.5000000, v2 = 1 = 1.5000000
v1 = 2 = 1.4500000、v2 = 2 = 1.4600000
v1 = 3 = 1.4550000, v2 = 3 = 1.4550000
の計算で高い精度に正規化され、その後の計算で低い精度にこの数を正規化すると、単に低い精度にこの数を正規化した場合とは異なる結果になることが判明しました。
というのは、計算時に高い精度で正規化した数値を、その後の計算で低い精度で正規化すると、ただ低い精度で正規化した場合とは異なる結果になることがわかったからです。
失礼ですが、どのようにして欲しい値を手に入れるのでしょうか?
推奨機能を使えば
- あるケースでは、正しく丸められた値が得られます
0.06-0.02=NormalizeDouble(0.03999999999,2) =0.04
割り算は近似的で、正規化が必要です。
- 2番目のケースでは、丸めも出てきますが、この場合は必要ありません
0.06-0.024= NormalizeDouble(0.036,2) =0.04
ここでは正規化(丸め)は必要ありません。
しかし、四捨五入ではなく、正規化するにはどうしたらいいのでしょうか?
失礼ですが、どのようにして欲しい値を手に入れるのでしょうか?
そのためには、「正しい価値観」とは何かを定式化することに意味があるのです))
推奨機能を使えば
- あるケースでは、正しく丸められた値が得られます。
0.06-0.02= NormalizeDouble(0.03999999999,2) =0.04と なります。
割り算は近似的に行われるので、正規化しないとできない。
- 2つ目のケースでは、丸めも発生しますが、このケースでは必要ありません
0.06-0.024= NormalizeDouble(0.036,2) =0.04と なります。
ここでは正規化(丸め)は必要ありません。
しかし、値を丸めるのではなく、きちんと正規化するにはどうしたらいいのでしょうか?
上の例では、正規化の「正しさ」を判断する何らかの直感的なアルゴリズムを使っていることがわかります。前者では無限小数、後者では有限小数である。実数を目的の形に変換するアルゴリズムを調整する。
最も簡単な方法は、事前に必要な精度を決めておくことです。
そのためには、単純に「正しい価値観」とは何かを定式化することに意味があります))
上記の例から、正規化の「必要性」を判断するために、何らかの直感的なアルゴリズムを使っていることがわかります。前者では無限小数、後者では有限小数である。実数を目的の形に変換するアルゴリズムを調整する。
最も簡単な方法は、必要な精度をあらかじめ決めておくことですが。
0.036(小数点以下3桁)が必要な場合は、2ではなく3に正規化します。
3桁までが正規化されるはずと勘違いしていました。このようなことは可能でしょうか?
3桁までが正規化されるはずと勘違いしていました。そのようにうまくいくのでしょうか?
これがあなたのコードです。
2の代わりに3を入れると、0.036になります。