如果我们定义了double a = 2.0,而它在内存中被存储为2.0000001或1.9999999,很明显,NormalizeDouble()不会有帮助,因为它将返回一个不准确的值! 我认为这样的错误在记忆变量值时几乎不会发生。此外,我不认为数字2.0会被存储为1.9999999999999,因为每个字符(数字或点)都是以比特串中的特定比特来存储的因此,数字2.0被安全地存储为2.00000...00。
另一种情况是我们自己不确定征兆的时候。
a = 4.0; b = 2.0; c = a / b // -- "除法 "操作由处理器完成,或者说由协处理器完成,它用字符(数字)填充前台。
手术后,它可以。 最常见的是。 с = 2.000...0 с= 1.99999999... с= 2.00000001...
double MyNormalizeDouble(double value, int digits)
{
int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
с помощью которого мы из VALUE сделаем целое число
double result = MathRound(factor * value) / factor;
return(result);
}
...
Irtron的 代码之美在于它的紧凑性(绝对没有多余的东西--甚至变量都被保存了!) ...
在这里,看看Irtron 提出的方法 它既紧凑又比我的快,但即使乍一看也很可疑,因为比较涉及两个变量 double!!!!。在这个方案中,只有
数字 作为常数,可以进行比较,而变量a,也要进行比较,仍然是未归一化的双数!在这个方案中,只有数字 作为常数,可以进行比较。这是否会引起人们的怀疑?(在常量下,我理解为通常的常量--"#define "和那些没有参与操作的变量)。 此外,在其他分支中,开发人员自己写道,即使是常量的两倍,也最好不要进行比较!!。这也是不正确的,做NormalizeDouble(a) ! NormalizeDouble(b), !OC!- 比较运算符! 更重要的是,在原始版本中,而不是
常数 是这样的 b = Point / 2- 这里已经有两个非标准化的变量了?我愿意相信这个变体是天才,但首先要打消我的疑虑!也许有人也会在我的变体中发现错误?
下面看看Irtron 建议的方法
请再仔细看看。
特别是在原始版本中,而不是数字 常数,所以 b = Point / 2- 这里已经有两个非正常化的变量?
我已经告诉过你关于正常化的问题了。首先,告诉我为什么要 应用它,然后是如何 应用和 在哪里 应用。
例如,也许你知道,为什么我们要用14个标志的准确性来比较价格,这在上面的讨论中被提到是一些成就?:)让我提醒你,我建议的函数叫做ComparePrice :)
Irtron писал (а):
...
我建议采用不同的方法。
请再仔细看看。
...
我们谈论的是什么版本?
我已经告诉过你关于规范化的问题。首先,告诉我为什么 要应用它,然后是如何 应用和 在哪里 应用。
例如,也许你知道,为什么我们要用14位数的精确度来比较价格,这在上面的讨论中被提到是某种成就?:)让我提醒你,我建议的函数叫做ComparePrice :)
...
int ComparePrice(double a, double b)
{
a -= b。
b = 点/2。
如果(a>b)
返回(1)。
如果(a < -b)
返回(-1)。
返回(0)。
}
只是提醒一下,我建议的函数叫作ComparePrice。:)
如果你注意到,我还引用了名为ComparePrice的函数。只是你的已经被 VBAG 修改过了。这就是为什么我提到的原始版本指的是原始版本,也就是你的功能!"。
我自己测试了这两个功能。是的,他们原来是更快。但如何检查比较的可靠性?我对两个变量的双倍比较感到非常困惑。虽然所有的都必须是正确的,因为采取了一个区间!但仍然有人怀疑,它并不总是能正确地工作!
这里是关键的问题,对吗?我自己也想了很久:"你打出双倍,得到双倍"。
我还没有找到确切的答案。但我可以这样想象
双重a = 2.000000000000
双倍b = 2.000000000001
double c = 1.999999999999
所有这些变量都是不同的,并存储在内存中,精确到最后一位数字!
在这种情况下,我们自己定义符号(数字)。所有没有定义的东西都填上了零。
如果我们定义了double a = 2.0,而它在内存中被存储为2.0000001或1.9999999,很明显,NormalizeDouble()不会有帮助,因为它将返回一个不准确的值!
我认为这样的错误在记忆变量值时几乎不会发生。此外,我不认为数字2.0会被存储为1.9999999999999,因为每个字符(数字或点)都是以比特串中的特定比特来存储的因此,数字2.0被安全地存储为2.00000...00。
另一种情况是我们自己不确定征兆的时候。
a = 4.0;
b = 2.0;
c = a / b // -- "除法 "操作由处理器完成,或者说由协处理器完成,它用字符(数字)填充前台。
手术后,它可以。
最常见的是。
с = 2.000...0
с= 1.99999999...
с= 2.00000001...
即结果往往与真实值相差很小。
大的错误很少发生。
с = 2.3
在这里,有两种解释。
1)调用a或b时,部分位串在内存中受到影响,即变量a和b被改变。
2)在 "除法 "操作中发生错误。
我认为2)出现的频率最高。为什么我不知道。我认为这与协处理器旨在高度优化以至于无用的事实有关。
当把一个变量与数字2.000...00相比较时,相等显然会失败。不是所有的位子都会相等。
现在,NormalizeDouble()来帮忙了!
NormalizeDouble()将 "修复 "这个小错误!
由于误差通常非常小,用小的精度进行四舍五入总是会得到正确的结果。
这样看吧。
将数字 a=2.111...11四舍五入 到第二位数。
NormalizeDouble()将把2.11写进一个新的变量中,并在剩余的位子上填入0,而不是1!
我想它会是这样的。
在这里,我尽力解释为什么需要NormalizeDouble()。
直到最近,我还对这种解释完全满意,但最近我相信,这种方案并不总是有效的。
因此,我很乐意接受任何有理有据和可以理解的批评!
另外,在其他主题中,开发人员自己写道,即使是双常数也最好不要进行比较!!。
如果你能,请给我一个链接!
我有一个问题要问开发者。
请解释使用常数比较双数时有哪些限制或可能出现的问题。
1.
双重a=1.23456789。
双b。
如果(a>b)或如果(a<b)
并以这种形式。
2.
#define a 1.23456789;
双b。
如果(a>b)或如果(a<b)
特别是由于原始版本的 b = Point / 2 而不是常数--这里已经是两个非正则变量中的两个?
但鉴于你关于双常数比较不可靠的说法,整个问题就失去了意义。我们需要更仔细地研究这个问题。
我想知道开发商会怎么说。
...
现在这对我来说是个新闻了!这就是他们所谓的实质性问题!
如果你能,请给我一个链接!
...
我记得有人在什么地方写过,但不记得在哪里了(((((。所以,可能,我写的东西并不正确。"在其他线程中,开发人员自己写的"!
我表示歉意。
但如果我找到了链接,一定要发布。
我想我是在一本关于C++的书中读到的。它描述了如何比较实数,并说最好去找整数!
...
这对我来说是个新闻!这就是他们所谓的实质性问题!
如果你能,请给我一个链接!
...
我记得有人在什么地方写过,但不记得在哪里了(((((。所以,可能,我写的东西并不正确。"在其他线程中,开发人员自己写的"!
我表示歉意。
但如果我找到了链接,一定要发布。
我想我是在一本关于C++的书中读到的。它描述了如何比较实数,并说最好去找整数!
我有一个问题要问开发者。
请澄清使用常数比较配音时有哪些限制或可能出现的问题。
1.
双重a=1.23456789。
双b。
如果(a>b)或如果(a<b)
并以这种形式。
2.
#define a 1.23456789;
双b。
如果(a>b)或如果(a<b)
这种对话似乎无止境地进行下去。当一个新用户获得适当的经验和知识时,他通常会设法撞见正常化几次。
也许,在MT5中,强制限制实数在比较操作中的准确性是有意义的,比如,限制在小数点后8位(即强制执行NormalizeDouble(),数字=8)。只有在明确指定NormalizeDouble()函数的情况下,才按照其中指定的参数进行归一化处理。 在这种情况下,问题出现的频率会少得多,即只有当用户完全需要指定的精度时才会出现。 在我看来,这个家伙有点,但还是比萝卜甜的。
你好!
如你所知,不仅是计算的正确性,而且你写的代码的可靠性也取决于编程的风格和代码的准确性。
我们不写玩具,因此编写的程序的操作可靠性是第一要求。大多数计算都是以分贝为单位进行的,两个实数的正确比较
程序代码中的两个实数,需要一定的方法和准确性。
我正试图找出 "正确的 "编程风格,因此提出这个问题。
对于一个表达式
双A。
双b。
如果(a==b)或如果(a!=b)
{......}{......}
开发商建议这样做
//+------------------------------------------------------------------+
//| 用于比较两个实数的函数。
//+------------------------------------------------------------------+
bool CompareDouble(double Number1, double Number2)。
{
bool Compare = NormalizeDouble(Number1 - Number2, 8) == 0;
返回(比较)。
}
//+------------------------------------------------------------------+
这个代码正确吗?
双A。
双b。
如果(a>b) 如果(a<b)
{......}{......}
在一般情况下很可能不是。检查的正确方法是什么?
总的来说,哪种工作方式更适合使用杜伯尔?
提前感谢每个人的答复。
你把事情搞得一团糟......:)
浮点数的比较是通过比较差值的模数与一个小的阈值来完成的。
例如,返回(fabs(d1-d2) < 1e-10)。
浑水摸鱼有什么意义......NormalizeDouble(...)函数 只是为了获得漂亮的报告。