2016.09.2723:56:01.178 Test (Si-12.16,H1) 02016.09.2723:56:01.178 Test (Si-12.16,H1) sign
2016.09.2723:56:01.178 Test (Si-12.16,H1) 128= 02016.09.2723:56:01.178 Test (Si-12.16,H1) 64= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 32= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 16= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 8= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 4= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 2= 12016.09.2723:56:01.178 Test (Si-12.16,H1) 1= 02016.09.2723:56:01.178 Test (Si-12.16,H1) exponenta E - 127:
2016.09.2723:56:01.178 Test (Si-12.16,H1) implicit_1 03203203203203203203203203203203203203203203203203203203203203203212016.09.2723:56:01.178 Test (Si-12.16,H1) mantissa:
2016.09.2723:56:01.178 Test (Si-12.16,H1) ----------
2016.09.2723:56:01.178 Test (Si-12.16,H1) value = 0.5000000596046448
废弃的
标准库有 一个颗粒度感知的价格归一化功能
标准库有 一个颗粒度感知的价格归一化功能
我开始猜测NormalizeDouble(new_lot-sum_lots,Lots_Digits);它并不完全输出0,而是存储一些尾数
如果变量new_lot和sum_lots相等,那么差值正好为0。但不知道你是如何计算的,它们在计算时可能确实不相等,因此有非零的差异。像这样做同样的事情。
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits)。
如果变量在指定位数内相等,那么差值将严格为0。
如果变量new_lot和sum_lots相等,那么差值正好为0。但不知道你是如何计算的,它们在计算时可能确实不相等,因此有非零的差异。像这样做同样的事情。
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits)。
如果变量在指定的位数内相等,差值将严格为0。
再次关于四舍五入......
请告知有关情况(不要扔西红柿,我是一个人道主义者)。
有这样一个变量。
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
德尔塔最初是规范化的。
OrderLots可能应该返回规范化的配音。
但不知何故,有时在罕见的情况下,我得到了2.775557561562891e-17这样的数字。
所以它几乎是零,但不是零.......
第一个问题 - 这是否正常?
...
我又仔细读了一遍。这是不正常的。如果NormalizeDouble函数 操作。
- 整数部分被选中 - I
- 分数部分被选中 - F
- F = F * 10^digits
- F = F(+或-取决于符号) 0.5
- F = (F的整数部分) / 10^个数字
- 结果 = I + F
那么如果new_lot和sum_lots在指定的位数内相等,NormalizeDouble(new_lot - sum_lots, Lots_Digits) 的结果也应严格为零。在极少数情况下,最后一位数字可能相差1(原因在第4和第5项),但结果 2.775557561562891e-17很奇怪,不应该是这样。我写了一个小的教程代码(我自己也有兴趣去探究),把一个浮动数的内脏翻出来。如果有人感兴趣,你可以运行它(C++代码,你可以使用一些在线编译器。这里https://goo.gl/tP691X, 例如)
f处的输出==0.5+1/(2^24)。1/(2^24)是尾数在某一程度上的最小有效数字。
学位=126-127=-1
尾数=1.000000000000000000001
将尾数移至-1度=0.100000000000000001=1^(-1)+1^(-24)=1/(2^1)+1/(2^24)=0.5+0.00000005960464478=0.50000005960464478
作为一个理论https://habrahabr.ru/post/112953/。
SZZ:这个在线编译器比http://rextester.com/l/cpp_online_compiler_gcc。
我写了一个小的教程代码(我自己也有兴趣去探究),把一个浮动数的内脏翻出来。如果有人感兴趣,你可以运行它(C++代码,你可以使用一些在线编译器。这里https://www.tutorialspoint.com/compile_cpp11_online.php, 例如)
你也可以在MQL5中运行它--通过连接这个库,用_R(f)[(char)Pos](或_R(f).Bytes[Pos])代替c[Pos]。
SZ
结果
尾数怎么了?
32是问题的ascii代码。看起来,出现错误 的库没有char版本。我认为我们需要消除尾数值之间的问题。或者,也许用""来代替""写""?
尾数怎么了?
32是问题的ascii代码。它看起来像一个有毛病的图书馆。我认为我们需要消除尾数值之间的问题。或者,也许用""来代替""写""?
fmtprntl.mqh不是我的,所以我不能确定。
我不想麻烦,所以对于你的f打印的字节值
一个相关的副作用。
事实证明这很方便。但它最初并不打算以这种方式使用。
有一些特殊的功能用于打印具有所需精度的实数。
告诉我为什么在计算过程中需要对实数进行四舍五入?因为在这种情况下,你会失去计算的准确性!
我们谈论的是价格的正确比较,停止,地段
你在这里需要有一定的准确性。