NormalizeDoubleのパラドックス - ページ 11

 
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を使用しない端数を表現する独自の自転車を書く必要があります(いくつかのライブラリがあるかもしれません、興味はありません)。

また、文字列への変換時にテールが追加されることはなく、初期状態で存在する。

 
transcendreamer:

というわけで、私の疑問は解決しましたので、この話題は終わりにしましょう。

解決策:正規化した後でも丸めを強制する必要があります。

間違った解決方法です。四捨五入するときは、掛け算、丸め、割り算。最後の除算の後、数値は非正規化されます。
 
transcendreamer:

まさかが、結果的には尾を引いているのです。

...

正規化後のテールはありません。
 
Integer:
ノーマライズ後のテールはありません。

誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸めた)。しかし、NormalizeDouble()の 後にtailがあります。

 
Integer:
間違った解決方法です。四捨五入するときは、掛け算、丸め、割り算。最後の除算の後、数値は非正規化されます。

ノーマライゼーションとはどういう意味ですか?ストリンゴがここで言っていたのは、アルゴリズムはこんなものだということだ。

double NormalizeDouble(double val, int digits)
{
    val *= 10 ^ digits
    округляем к ближайшему целому
    val /= 10 ^ digits
    return val
}
 
pavlick_:

誤解を招いているのでは?正規化してもテールがないとはどういうことですか?数値から得た値を丸めた文字列の中だけは、尾を引くことはありえない(doubleではなく、文字列の中ですでに丸められている)。しかし、NormalizeDouble()の後では尾を引いています。

まあ、私が誰かをミスリードしていると信じたいのなら、信じてください。ここでいろんな人を見てきました、あなたの「原則的な」立場には驚かないことにします。
 
pavlick_:

ノーマライゼーションとはどういう意味ですか?ストリンゴはここで、アルゴリズムはこんな感じだと言っている。

正規化というのはどういうことなのか、もっと興味深いですね。
 
Integer:
具体的な質問をしているのに、水を差すようなことを言う。自分の意見を説明したり主張したりするのは、ある意味普通のことです。
 
pavlick_:
具体的な質問をしているのに、水を差すようなことを言う。自分の意見を説明したり主張したりするのは、普通どうなんでしょうか?
教科書や資料を声に出して読む、か。あるいは、「約」という言葉について、辞書を声に出して読んでみてください。
 
Integer:
教科書や資料を声に出して読むとか?あるいは、「約」という言葉について、辞書を声に出して読んでみてください。
はっきり言って、話すことは何もありません。そして、自分の言葉に責任を持てない人は、会話に参加しない方がいい。