NormalizeDoubleのパラドックス - ページ 11 1...456789101112 新しいコメント pavlick_ 2015.03.19 01:32 #101 transcendreamer:気になるのは、分数を計算して正規化し、変数に書き込み、再度読み出して正規化すると、tailsが発生することですたとえばbasis[0]=NormalizeDouble(sum_A,2);GlobalVariableSet("Equity-"+portfolio_id,basis[0]); ...current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);text = "Positions synchronized at " + current + " for portfolio: " + portfolio_name;if(!automatic) MessageBox(text,""); else Print(text);に変更しました。text = "Positions synchronized at " + DoubleToStr(current,2) + " for portfolio: " + portfolio_name;if(!automatic) MessageBox(text,""); else Print(text);そして、尻尾はないようです、ふぅ、ふぅ、ふぅ、ふぅ...。すでに書きましたが、繰り返しますが、2進数では存在しない数字もあります。0.1がない、0.3がないなど、いろいろあります。double val =NormalizeDouble(0.1434, 1) と何度書いても、そんな数値は存在しないので、0.1 は得られないのです。例えば、数字は以下のように表現されます。0.1 = 0.10000000000000001 0.2 = 0.2000000000001 0.3 = 0.299999999999999 0.4 = 0.400000000000002 0.6 = 0.599999999999998ただし、 0.125 = 0.125 0.25 = 0.25 0.5 = 0.5もし、これが非常に気になるなら、丸めるか、fpuを使用しない端数を表現する独自の自転車を書く必要があります(いくつかのライブラリがあるかもしれません、興味はありません)。また、文字列への変換時にテールが追加されることはなく、初期状態で存在する。 Dmitry Fedoseev 2015.03.19 01:59 #102 transcendreamer:というわけで、私の疑問は解決しましたので、この話題は終わりにしましょう。解決策:正規化した後でも丸めを強制する必要があります。 間違った解決方法です。四捨五入するときは、掛け算、丸め、割り算。最後の除算の後、数値は非正規化されます。 Dmitry Fedoseev 2015.03.19 02:00 #103 transcendreamer:まさかが、結果的には尾を引いているのです。... 正規化後のテールはありません。 pavlick_ 2015.03.19 02:13 #104 Integer: ノーマライズ後のテールはありません。誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸めた)。しかし、NormalizeDouble()の 後にtailがあります。 pavlick_ 2015.03.19 02:18 #105 Integer: 間違った解決方法です。四捨五入するときは、掛け算、丸め、割り算。最後の除算の後、数値は非正規化されます。ノーマライゼーションとはどういう意味ですか?ストリンゴがここで言っていたのは、アルゴリズムはこんなものだということだ。double NormalizeDouble(double val, int digits) { val *= 10 ^ digits округляем к ближайшему целому val /= 10 ^ digits return val } Dmitry Fedoseev 2015.03.19 02:32 #106 pavlick_:誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸められている)。しかし、NormalizeDouble()の後では尾を引いています。 まあ、私が誰かをミスリードしていると信じたいのなら、信じてください。ここでいろんな人を見てきました、あなたの「原則的な」立場には驚かないことにします。 Dmitry Fedoseev 2015.03.19 02:33 #107 pavlick_:ノーマライゼーションとはどういう意味ですか?ストリンゴはここで、アルゴリズムはこんな感じだと言っている。 正規化というのはどういうことなのか、もっと興味深いですね。 pavlick_ 2015.03.19 02:43 #108 Integer: 具体的な質問をしているのに、水を差すようなことを言う。自分の意見を説明したり主張したりするのは、ある意味普通のことです。 Dmitry Fedoseev 2015.03.19 02:51 #109 pavlick_: 具体的な質問をしているのに、水を差すようなことを言う。自分の意見を説明したり主張したりするのは、普通どうなんでしょうか? 教科書や資料を声に出して読む、か。あるいは、「約」という言葉について、辞書を声に出して読んでみてください。 pavlick_ 2015.03.19 03:01 #110 Integer: 教科書や資料を声に出して読むとか?あるいは、「約」という言葉について、辞書を声に出して読んでみてください。 はっきり言って、話すことは何もありません。そして、自分の言葉に責任を持てない人は、会話に参加しない方がいい。 1...456789101112 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
気になるのは、分数を計算して正規化し、変数に書き込み、再度読み出して正規化すると、tailsが発生することです
たとえば
basis[0]=NormalizeDouble(sum_A,2);
GlobalVariableSet("Equity-"+portfolio_id,basis[0]);
...
current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);
text = "Positions synchronized at " + current + " for portfolio: " + portfolio_name;
if(!automatic) MessageBox(text,""); else Print(text);
に変更しました。
text = "Positions synchronized at " + DoubleToStr(current,2) + " for portfolio: " + portfolio_name;
if(!automatic) MessageBox(text,""); else Print(text);
そして、尻尾はないようです、ふぅ、ふぅ、ふぅ、ふぅ...。
すでに書きましたが、繰り返しますが、2進数では存在しない数字もあります。0.1がない、0.3がないなど、いろいろあります。double val =NormalizeDouble(0.1434, 1) と何度書いても、そんな数値は存在しないので、0.1 は得られないのです。
例えば、数字は以下のように表現されます。
0.1 = 0.10000000000000001
0.2 = 0.2000000000001
0.3 = 0.299999999999999
0.4 = 0.400000000000002
0.6 = 0.599999999999998
ただし、
0.125 = 0.125
0.25 = 0.25
0.5 = 0.5
もし、これが非常に気になるなら、丸めるか、fpuを使用しない端数を表現する独自の自転車を書く必要があります(いくつかのライブラリがあるかもしれません、興味はありません)。
また、文字列への変換時にテールが追加されることはなく、初期状態で存在する。
というわけで、私の疑問は解決しましたので、この話題は終わりにしましょう。
解決策:正規化した後でも丸めを強制する必要があります。
まさかが、結果的には尾を引いているのです。
...
ノーマライズ後のテールはありません。
誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸めた)。しかし、NormalizeDouble()の 後にtailがあります。
間違った解決方法です。四捨五入するときは、掛け算、丸め、割り算。最後の除算の後、数値は非正規化されます。
ノーマライゼーションとはどういう意味ですか?ストリンゴがここで言っていたのは、アルゴリズムはこんなものだということだ。
誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸められている)。しかし、NormalizeDouble()の後では尾を引いています。
ノーマライゼーションとはどういう意味ですか?ストリンゴはここで、アルゴリズムはこんな感じだと言っている。
具体的な質問をしているのに、水を差すようなことを言う。自分の意見を説明したり主張したりするのは、普通どうなんでしょうか?
教科書や資料を声に出して読むとか?あるいは、「約」という言葉について、辞書を声に出して読んでみてください。