mt5策略测试器的刻度 - 页 9

 
WhooDoo22:

你好,MQL5社区。

在测试器中运行策略时,有没有人遇到过类似这样的数字?-1.000000000006551e-005和1.000000000006551e-005(是的,那是11个零)。这一定是一种特定的双倍格式类型,但什么双倍格式类型,嗯?

另外,我在阅读MQL5文档时,好像是的,好的,好的,标准int数据类型的最小值是-2 147 483 648,最大值是2 147 483 647,那么是的,当然还有无符号int数据类型,最小值是0,最大值是4 294 967 295,但是;) 没有int数据类型的最小值是负4 294 967 295 ,最大值是 0。 前面的陈述可能也适用于其他数据类型。

谢谢你

0.00001和1 e-5是一样的,是一种指数格式。 最后的额外数字,6551相当于0.00000000000000006551,这就是为什么我们在比较双数时有问题.......你需要读一读这个,如果需要的话做一些研究,这样你就会明白发生了什么:Can price != price ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001和1 e-5是一样的,是一种指数格式。 最后的额外数字,6551相当于0.00000000000000006551,这就是为什么我们在比较双数时有问题.......你需要读一读这个,如果需要的话做一些研究,这样你就会明白发生了什么:Can price != price ?

西蒙,

非常感谢,我正在读这个主题,我相信参与的mql4主题发帖人对双倍数比较的一般解决方案是发现并利用一种方法对这些双倍数进行适当的四舍五入以返回正确的值。对此你怎么说?

谢谢你

 
WhooDoo22:

西蒙,

非常感谢,我正在读这个主题,我相信参与的mql4主题发帖人对双倍数比较的一般解决方案是发现并利用一种方法对这些双倍数进行适当的四舍五入以返回正确的值。你对此有何看法?

谢谢你

在你上面的帖子中,双数的比较并不重要,理解为什么你不能简单地比较双数才是重要的。
 
RaptorUK:
在你上面的帖子中,比较双数并不重要,理解为什么你不能简单地比较双数才是重要的。

为什么?因为我认为价格值是以四位数和五位数的格式返回的(除了像USDJPY这样的例外,它返回的价格值是两位数和三位数)。我试着把它一次性分解开来,因为我不希望把这个问题拖得太长。

USDCHF的买入价目前是0.92909,我相信MetaTrader5计算这些价格值的最远位置是小数点右边的16位,如果是这样的话,那么在最后一位数字9之后有11位被扔到了计算USDCHF的价格0.9290900000000000。我认为双倍数不能简单比较的原因是,价格小数点右边的其余位置(不是终端可读的位置,而是终端不可读的位置)导致不平等问题。

谢谢你

 
WhooDoo22:

为什么呢?因为我认为价格值是以四位数和五位数的格式返回的(除了像USDJPY这样的例外,它返回的价格值是两位数和三位数)。我试着一劳永逸地分解它,因为我不希望拖得太久。

USDCHF的买入价目前是0.92909,我相信MetaTrader5计算这些价格值的最远位置是小数点右边的16位,如果是这样的话,那么在最后一位数字9之后有11位被扔到了计算USDCHF的价格0.9290900000000000。我认为双倍数不能简单比较的原因是,价格小数点右边的其余位置(不是终端可读的位置,而是终端不可读的位置)造成了不平等的问题。

谢谢你

双数的问题来自于它们的二进制表示。有些双数没有精确的二进制表示,所以你会得到像1.000000000006551e-005的东西。我在这里不做详细解释,如果有兴趣,你可以阅读这个 例子。
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

为什么?

这在我给了一个链接的主题的第一页上都有解释,实质上;一个1.57373的值实际上可能被保存为1.5737300000000001的双倍值,而NormalizeDouble(1.57373, 5)可能产生一个1.57372999999999的双倍值。57372999999999这两个四舍五入的值都是相等的,但直接比较却不相等......这就是双倍值的存储方式,它们是浮点数(查找浮点数,阅读并理解),通常持有的值与你认为被持有的值不完全相同。

所以你的评论显示了两个双数的减法,你看到的差值是1.0000000000xyz -e5,这是因为双数是这样存储的--浮点数

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
双数的问题来自于它们的二进制表示。有些双数没有精确的二进制表示,所以你会得到像1.000000000006551e-005的东西。我在这里不做详细解释,如果有兴趣,你可以阅读这个 例子。

1.000000000006551e-005在十进制右边的第十六位是e-005。

你是说1.000000000006551e-005没有精确的二进制表示,因为它在十进制右边的第十六位不是一个整数,是e-005?


"我在这里不进入详细的解释。"

为什么不呢?如果你想写一个详细的解释,那么尽可以这样做。


"如果有兴趣你可以阅读这个 为例。"

我已经开始读了。

谢谢你

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"我在这里不进入详细的解释。"

为什么不呢?如果你想写一个详细的解释,那么尽可以这样做。


你还记得我们曾经讨论过,如果你想能够正确地编码,你应该知道的基本的基本的东西吗? 浮点数是其中之一......DYOR,那里有很多信息,找到它,阅读它,理解它,然后你将能够更好地编码。
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

1.000000000006551e-005的小数点右边的第十六位是e-005。

你是说1.000000000006551e-005没有精确的二进制表示,因为它在十进制右边的第十六位不是整数,是e-005?


如果你读了我的链接和/或RaptorUK的链接,你就会更清楚。如果没有,再读一遍 :-D

1.000000000006551e-005只是0.0000100000006551的另一种记法。

 
RaptorUK:

这在我给了一个链接的主题的第一页上都有解释,实质上;一个1.57373的值实际上可能被保存为1.5737300000000001的双倍值,而NormalizeDouble(1.57373, 5)可能产生一个1.57372999999999的双倍值。57372999999999这两个四舍五入的值都是相等的,但直接比较却不相等......这就是双倍值的存储方式,它们是浮点数(查找浮点数,阅读并理解),通常持有的值与你认为被持有的值不完全相同。

所以你的评论显示了两个双数的减法,你看到的差值是1.0000000000xyz -e5,这是因为双数是这样存储的--浮点数

1.57373 (忽略不计)

1.5737300000000001

1.5737299999999999

"两个四舍五入的值都相等"

两个数值四舍五入后都等于1.57373。


"但直接比较是不相等的"

是的,因为有区别。


"这就是双倍值的存储方式"

诸如1.5737300000000001这样的双倍值被存储为1.57373(如果使用了normalize double我想)。如果不使用normalize double,双倍值1.5737300000000001会保持这个数值格式,对吗?


"而且通常所持有的数值与你认为所持有的数值并不完全相同。"

我的最后一句话也是对这句话的回应。


我将阅读你提供的链接,谢谢你的帮助。

谢谢你