首页 > 解决方案 > MQL4 StringToDouble 改变变量的值?

问题描述

MQL4 文档指出双精度类型变量的值限制为:

"Minimal Positive Value" = 2.2250738585072014e-308
"Maximum Value"          = 1.7976931348623158e+308

请参阅https://docs.mql4.com/basis/types/double

为什么StringToDouble()改变转换的值?

我是在做一件事却期待不同的结果吗?

void OnStart() {
  string s1 = "5554535251504900090807060504030201";
  double d1 = StringToDouble(s1);
  string s2 = DoubleToString(d1);

  Print("s2<",s2,">");
  printf("%099.8f",d1);
  Print("s1<",s1,">");
     
  return;<br>
}

这是我运行该代码时得到的结果:

s1<5554535251504900090807060504030201>
d1<000000000000000000000000000000000000000000000000000000005554535251504899684469244159852544.00000000>
s2<5554535251504899684469244159852544>

5554535251504900090807060504030201相当于
5.55454E+33

显然,这甚至远未接近1.7976931348623158e+308极限。

我在这里想念什么?

标签: mql4

解决方案


“我在这里缺少什么?”

记录在案的事实。

MQL4 使用不超过4-bytes 来存储int.
MQL4 使用不超过8-bytes 来存储double.

IEEE-754 标准定义了其余部分 - 这 64 位中保留了多少位:
指数( -308, 0, +308 )
符号( +, - )
其余部分,用于尾数的标准化形式:0.???????...????

论点,一个实际数字远离任何一个“边缘”< DBL_MIN, DBL_MAX >并不能解释精确数字降低精度表示(参见DBL_EPSILON ~ 2E-16DBL_DIG ~ 15-significant digits, or -bits DBL_MANT_DIG ~ 53, left from a 64-bit ( 8-字节)存储单元尾数)。

使用 IEEE-754 浮点数表示,有许多数字根本无法准确存储。

大量文献对此进行了解释,因此,如果您的用例需要,请随意深入挖掘,或者可以使用其他依赖于无限(无限)精度数字表示的工具。


推荐阅读