归一化的双重悖论 - 页 11

 
transcendreamer:

困扰我的是,当我计算一个小数,将其归一化,写进一个变量,然后再次读取并归一化时,我得到的是尾数

比如说

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);

而且似乎没有任何尾巴,呜,呜......

我已经写过了,我再重复一遍--有些数字不存在于二进制中。没有0.1,没有0.3和许多其他。无论你写多少次double val =NormalizeDouble(0.1434, 1),你都不会得到0.1,因为没有这样一个数字。

例如,数字的表示方法如下。

0.1 = 0.10000000000000001
0.2 = 0.2000000000001
0.3 = 0.2999999999999999999
0.4 = 0.400000000000002
0.6 = 0.59999999999999998


0.125 = 0.125
0.25 = 0.25
0.5 = 0.5

如果这非常令人不安,你要么需要四舍五入,要么自己写自行车来表示小数(可能有一些库,不感兴趣),不会使用fpu。

而且在转换为字符串的过程中没有添加尾巴,它们最初就在那里。

 
transcendreamer:

所以我已经解决了我的问题,我们可以结束这个话题。

解决办法:你必须强制四舍五入,即使在归一化之后也是如此。

错误的解决方案。在进行四舍五入时,你必须进行乘法、四舍五入、除法。在最后一次除法后,该数字将被非正常化。
 
transcendreamer:

很有可能...但就最终的结果而言--有尾巴!

...

正常化后没有尾巴。
 
Integer:
归一化后没有尾巴。

我认为你在误导这个人。你说归一化后没有尾巴是什么意思?只有在我们从一个数字中得到的字符串中才可能没有尾巴,并对数值进行了四舍五入(在字符串中已经四舍五入了,而不是在双倍中)。但在NormalizeDouble() 之后有尾巴。

 
Integer:
错误的解决方案。在进行四舍五入时,你必须进行乘法、四舍五入、除法。在最后一次除法之后,这个数字将是非正常化的。

你说的正常化是什么意思?斯特林格在这里说,该算法是这样的。

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

我认为你在误导这个人。你说归一化后没有尾巴是什么意思?只有在我们从一个数字中得到的字符串中才可能没有尾巴,并对数值进行了四舍五入(在字符串中已经四舍五入了,而不是在双倍中)。而在NormalizeDouble()之后,有尾巴。

好吧,如果你喜欢相信我在误导别人,相信我。我在这里见过各种各样的人,我不会对你的 "原则性 "立场感到惊讶。
 
pavlick_:

你说的正常化是什么意思?斯特林格在这里说,该算法是这样的。

你说的正常化是什么意思,会更有意思。
 
Integer:
我在问你一个具体的问题,你却在给我浇水。解释和论证你的观点是有点正常的。
 
pavlick_:
我在问你一个具体的问题,你却在给我浇水。如何解释和论证自己的观点才算正常?
大声阅读教科书和文件,还是什么?或者大声朗读字典,关于 "大约 "一词?
 
Integer:
大声阅读教科书和文件还是什么?或者大声朗读字典,关于 "大约 "一词?
很明显,我们没有什么可谈的。如果你不对你的话负责的话,你最好不要参加谈话。