向MQL4大师们提问。还是关于双倍比较。 - 页 9

 
SK. писал (а):

我这样说是为了进行或多或少的比较。

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))

也就是说,视图结构并不总是有效的。

double a = NormalizeDouble(x,Digits);
double b = NormalizeDouble(y,Digits);
 
if (a > b)
  {
  ...
  }
我认为第一个和第二个的结果是一样的
分配给变量ab 的结果被归一化,然后它们可以被比较,它们不会发生任何事情。
雷纳特写的是别的东西,因为在那个例子中,归一化数值的减法 结果,反过来说,并不是归一化的
如果你把一个操作的 最终结果 规范化,你可以把它分配给一个变量并进一步操作它。最主要的是,变量本身不应进一步改变其价值。
 
gravity001:
我没有检查多或少,但我确实检查了平等。
我在使用这种结构时出现了比较错误。

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
为什么,你不知道吗?

什么样的错误?
 
Simca:
而对我来说,第一和第二在结果上是一个和一个

这在某些情况下确实有效,但并非总是如此。这个 "不总是 "是由计算机内存中存储数值的特殊方式决定的。这只是它。

分配给ab 变量的结果被归一化,它们可以 进一步比较,不会发生任何事情。
你不能。也就是说,你可以做任何你想做的事情,但是为了得到一个有保证的结果,你应该在包含比较操作的表达式中直接应用NormalizeDouble()。

雷纳特写的是别的东西,因为在他的例子中,归一化数值的减法 结果没有归一化
是的,但这并不意味着你以前的说法是正确的。

如果你把一个操作的最终结果规范化,你可以把它分配给一个变量并进一步操作它。最主要的是,变量本身不能进一步改变其价值。
,由于使用的是特定的计算机技术,它可以在最后一位数字上改变其价值。这可能而且确实发生在用户没有注意到的情况下。这就是问题所在。在某些情况下,它会起作用(例如,在调试程序的过程中),但在使用这个程序时,它往往会按照无能的程序员的预期工作,有时则不会工作。

 

我对那些不得不向每个新用户解释1000次同样事情的开发者表示诚挚的慰问。

 
SK. писал (а):
重力001
我没有检查这个结构的多与少,但我检查了平等性。
我在使用这种结构时出现了比较错误。

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
为什么,你不知道吗?

什么样的错误?
条件没有得到满足,即平等没有得到满足?
另外,为什么你认为错误是在存储或从内存中读取变量的双倍?也许是算术运算 中的一个错误?

你认为在这种情况下不可能有错误吗?

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?
 
gravity001 писал (а):
На больше или меньше я не проверял эту конструкцию, а вот на равенство проверял.
У меня были ошибки при сравнении, когда я использовал такую конструкцию:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Почему, не знаете?

请演示这个错误!!!!
 
gravity001:
条件没有得到满足,即平等没有得到满足?
另外,为什么你认为错误是在存储或从内存中读取变量的双倍?也许是算术运算中的一个错误?

你认为在这种情况下不可能有错误。

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

我认为除法操作本身是正确执行的。

现在讨论的问题不是关于如何获得某个变量的值(无论是作为计算结果还是通过初始化变量获得的值),而是关于该变量的值在程序执行甚至只是计算机操作过程中的命运。而它的命运是不可预知的。因此,在对逻辑运算进行编程时,你应该使用红字的NormalizeDouble()函数。

要应用它是很好的。要正确应用它是非常好的。

不使用它是不好的。不正确的使用--不好。

---

在假期中,我想...

 
SK. писал (а):
这在某些情况下确实有效,但并非总是如此。这个 "不总是 "是由计算机内存中存储数值的特殊方式决定的。这只是它。
我知道在计算机内存中存储数值的方法。:)我有大约20年的编程经验。我过去甚至还教过大学生编程。

分配给ab 变量的结果被归一化,它们可以 进一步比较,不会发生任何事情。
你不能。所以,你可以做任何你想做的事情,但是为了得到一个有保证的结果,你应该在包含比较操作的表达式中直接应用NormalizeDouble()。

当然,在你将一个表达式的计算结果与任何东西进行比较之前,你必须对其进行归一化处理。谁能反驳呢?但这与我们的论点无关。我说的是代码的身份。不同的是,在第二种情况下,规范化的结果被存储在变量中。就这样吧!

也就是说,你声称NormalizeDouble函数的结果比double的位数大(这个函数的结果占据了更多的内存位数,至少是一个位数)。只有这样,我才能解释当把函数的结果保存在一个变量中时的任何损失(或变化)。 或者,当赋值时,要进行一些棘手的操作,而不仅仅是逐个字节地把数据从一个存储单元复制到另一个存储单元。

我再次强调,我不是在讨论比较操作的左右操作数分别归一的正确性或其他问题。 我只是在质疑上面两个代码片段的结果是否相同。

如果你将一个操作的结果规范化,你可以将其分配给一个变量,并对其进一步操作。最主要的是变量本身不应进一步改变其价值。
,由于使用了特定的计算机技术,它可能在最后一位数字上改变其价值。这可能而且确实发生在用户没有注意到的情况下。这就是问题所在。在某些情况下,它会起作用(例如,在调试程序的过程中),在使用这个程序时,它往往会像无能的程序员所期望的那样工作,而有时则不会工作。

哇哦! 而你指的是哪种 "特定的计算机技术"?对用户 来说,许多事情都 "不被注意",但我们毕竟是程序员。:)对我们来说,没有什么事情是不应该被注意 的,否则它就不是一台计算机,而是一个不可预测的结果的发生器。:)或者是我们的电脑已经有了一些错误的位子?有一天,它是这样读的,接下来...再来一次!在实数的算术运算中,结果确实不是绝对精确的(这与实数的表示方法有关)。但这并不适用于分配操作。一旦NormalizeDouble 函数起作用并返回一个double 类型的结果,这个结果就可以通过复制值放入一个变量中(所有字节都将被匹配)。进一步说,虽然变量值保持不变(即只可读,但没有任何东西被写入其中),但它以原始形式保存下来,没有任何标志在任何地方漂浮。阅读它,你会得到同样的东西。但如果你只是乘以1,然后把结果写回去,什么都不能保证。

 
SK. писал (а):

我对那些不得不向每个新用户解释1000次 同样事情的开发者表示诚挚的慰问。

这是一个公然的攻击--我想我会 忽略它。:)
 
gravity001:

你认为在这种情况下不可能有错误。

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

在这种情况下,操作的结果 将是APPLICABLE 2.0
非常远的数字的错误很可能是由于实数的表示方法造成的。