只要有可能,我更喜欢使用较大和较小的数字进行比较。
double a; double b; if(a>b) if(a<b) {......} {......}
这样,我就不必太担心双倍于某一数字的运行。
Vol = 156.00000002; NormVol = NormalizeDouble(Vol,2); 156.00
如果有必要将这些数字放在一起
if(a==b) или if(a!=b) {......} {......}
然后我首先将两个数字转换为点后的一个数字
a = NormalizeDouble(Vol1,2); b = NormalizeDouble(Vol2,2); if(a==b) или if(a!=b) {......} {......}
VBAG:
我正在翻阅大量的代码,我正在学习编程,在指标代码中很少发现这种情况。这就是问题所在--如何正确地做到这一点。
xeon。
你在计算指标时是否使用Normalize和类似的准备工作?我首先将两个数字转换为点后的相同数字
a = NormalizeDouble(Vol1,2); b = NormalizeDouble(Vol2,2); if(a==b) или if(a!=b) {......} {......}
我正在翻阅大量的代码,我正在学习编程,在指标代码中很少发现这种情况。这就是问题所在--如何正确地做到这一点。
我尽量避免使用NormalizeDouble 或"<"和">"符号,因为指标、脚本或专家顾问的双倍数可能有差异。
xeon ,
谢谢你的意见。
始终保持正常化,就永远不会有配音的问题!;)
在任何比较中,任何掺杂,并刻意选择准确。
注意平等 功能--如果稍微改变。
例如,equal( 0.123456784, 0.123456776 )在第一种情况下会返回真,但在第二种情况下会返回假;)
在任何比较中,任何掺杂,并刻意选择准确。
//--- NormalizeDouble double nd( double value, int precision ) { return( NormalizeDouble( value, precision ) ); } //--- MathAbs double abs( double value ) { return( MathAbs( value ) ); } //--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false. bool equal( double value1, double value2, int precision = 8 ) { return( nd( abs( nd( value1, precision ) - nd( value2, precision ) ), precision ) < nd( MathPow( 0.1, precision ), precision ) ); }
注意平等 功能--如果稍微改变。
bool equal( double value1, double value2, int precision = 8 ) { return( nd( abs( value1 - value2 ), precision ) < nd( MathPow( 0.1, precision ), precision ) ); }(在比较之前去掉每个数字的归一化),会得到不同的结果。
例如,equal( 0.123456784, 0.123456776 )在第一种情况下会返回真,但在第二种情况下会返回假;)
komposter:
始终保持正常化,就永远不会有配音的问题!;)
但会有性能问题。将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。
始终保持正常化,就永远不会有配音的问题!;)
Irtron:
将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。
将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。
让我解释一下。
很明显,这里面有一个概念的混淆。在intel架构中,有一种浮点数字类型用来表示固定精度的数字,特别是包括交易环境的所有数值,因为处理器有一个专门用于浮点运算的脱粒器。
事实上,固定精度的数字在机器表示方面与整数的差别很小。在这种情况下,小数位的存在是有条件的。这一特性被广泛用于硬件不支持浮点运算的架构中,如ARM,它通过在PDA和智能手机中的使用得到了推广。那里的浮动算术必须用相当重的代码来模拟,这使处理器升温,从而浪费了电池,更不用说程序的执行 速度了。所以只要不可能用整数,就会使用固定格式。 浮动精度在最极端的情况下使用。或者说,当然应该是这样。
没有什么能阻止对市场价值使用固定(即整数)的算术。
这并不适用于指标的计算值。在那里,直接的比较是很充分的。为什么要对它们进行任何精确的比较?
感谢komposter 和 Irtron ! 已经决定不再写了,坐下来发明自己,没有看到你的帖子。
请看我用自己狡猾的手写的:
//+------------------------------------------------------------------+
bool EqualDouble(double dN1, double dN2,int Digit)
{
double d1 =NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 == 0.0;
return(res);
}
//+
bool LessDouble(double dN1, double dN2,int Digit) // If dN1<dN2
{
double d1 = NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d2-d1 > 0.0;
return(res);
}
//+
bool MoreDouble(double dN1, double dN2,int Digit) // If dN1>dN2
{
double d1 = NormalizeDouble(dN2,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 > 0.0;
return(res);
}
//+------------------------------------------------------------------+
Покритикуйте, пожалуйста.
请看我用自己狡猾的手写的:
//+------------------------------------------------------------------+
bool EqualDouble(double dN1, double dN2,int Digit)
{
double d1 =NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 == 0.0;
return(res);
}
//+
bool LessDouble(double dN1, double dN2,int Digit) // If dN1<dN2
{
double d1 = NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d2-d1 > 0.0;
return(res);
}
//+
bool MoreDouble(double dN1, double dN2,int Digit) // If dN1>dN2
{
double d1 = NormalizeDouble(dN2,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 > 0.0;
return(res);
}
//+------------------------------------------------------------------+
Покритикуйте, пожалуйста.
VBAG:
请看我用马虎的手涂鸦的内容。
你想比较的是什么价值?价格、手数或指标值?
请看我用马虎的手涂鸦的内容。
Irtron:
我在开头写道。"试图获得'正确'的编程风格。"VBAG。
请看看我用马虎的手涂鸦的内容。
你想比较的是什么价值?价格、手数或指标值?请看看我用马虎的手涂鸦的内容。
从本质上讲,分词中的内容没有区别--只有数字四舍五入的准确性会有所不同,这取决于变量的要求。
如你所知,不仅是计算的正确性,而且编写的代码的可靠性也取决于代码中的编程风格和整洁度。
我们不写玩具,所以写好的程序的 可靠性是最重要的要求。大多数计算都是以杜伯尔为单位进行的,在代码中的正确比较
程序代码中的两个实数,需要一定的方法和准确性。
我正试图找出 "正确的 "编程风格,因此提出这个问题。
对于一个表达式
双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)
{......}{......}
在一般情况下很可能不是。检查的正确方法是什么?
总的来说,哪种工作方式更适合使用杜伯尔?
提前感谢每个人的答复。