MQL5 真實型(雙精度型,浮點型)

2021-08-08 14:44:15 字數 4514 閱讀 3355

真實型(或浮點型)以小數部分為代表值,在mql5語言裡,浮點型資料有兩種型別,在記憶體中實型資料的表示方法由 ieee 754水平規定,它並不依賴平台、作業系統和程式語言。

型別位元組大小

最小正值

最大值c++類似物

float

41.175494351e-38

3.402823466e+38

float

double

82.2250738585072014e-308

1.7976931348623158e+308

double

雙精度名稱是為了表示這些浮點型資料的雙倍準確率,在大多數情況下,雙精度型是最方便的,浮點型資料的精密度限制是不夠的,原因就在於浮點型資料還要節約記憶體(這就是真實型 資料龐大的重要性)。

浮點型資料由整數部分、小數點(.)和小數部分組成,其中整數部分和小數部分為一系列十進位制數字。

double a=12.111;   

double b=-956.1007;

float c =0.0001;

float d =16;

有更科學的方法輸入實常數,通常這些方法比傳統方法更簡潔。

double c1=1.12123515e-25;   

double c2=0.000000000000000000000000112123515; // 小數點後有24個零

print("1. c1 =",doubletostring(c1,16));

// 結果: 1. c1 = 0.0000000000000000

print("2. c1 =",doubletostring(c1,-16));

// 結果: 2. c1 = 1.1212351499999999e-025

print("3. c2 =",doubletostring(c2,-16));

// 結果: 3. c2 = 1.1212351499999999e-025

在二進位制系統中,實型資料以限制精確度來儲存,而常用作十進位制計數法。這就是在十進位制系統中,許多被取代的數字在二進位制系統中被輸出為無數小數點的原因。

例如,0.3和0.7的小數部分被取代,而0.25卻被精確保留,因為它的有效數字是兩位。

就這一點而言,不要實際地區對比兩個真實資料,因為對比是不精確的。

void onstart()  

如果你仍需要對比兩個真實型資料,有兩種方法,第一種,在同樣的小數字對比他們之間的不同。

bool equaldoubles(double d1,double d2,double epsilon)   

void onstart()

上例中第五位比dbl_epsilon多,值是2.2204460492503131e-016,與浮點型資料相一致的是 flt_epsilon = 1.192092896e-07。這些值有如下意義:滿足條件的最低值 1.0 + dbl_epsilon! = 1.0(大量的浮點型數值 1.0 + flt_epsilon! = 1.0)。

第二種方法通過0將兩種真實型資料進行了標準對比,它是無意義的,因為任何標準化操作都能給出非標準的結果。

bool comparedoubles(double number1,double number2)   

void onstart()

一些數字協同處理器的操作能夠導致無效的真實型數字,不能運用到數字操作和對比中,因為用無效真實型資料的操作結果是不能定義的。例如,當想要計算2的反正弦,結果可能無窮負。

double abnormal = matharcsin(2.0);    

print("matharcsin(2.0) =",abnormal);

// 結果: matharcsin(2.0) = -1.#ind

除了負無窮大也還有正無窮大和nan(不是數字),確定數字是否是無效的,可以運用 mathisvalidnumber()。功能,根據ieee標準,可以用專用機描述。例如,雙精度型正無窮代表小的 0x7ff0 0000 0000 0000。

struct str1  

; struct str2

;//--- 開始

str1 s1;

str2 s2;

//--

s1.d=matharcsin(2.0); // 獲得無效資料 1.#ind

s2=s1;

printf("1. %f %i64x",s1.d,s2.l);

//--

s2.l=0xffff000000000000; // 無效資料 1.#qnan

s1=s2;

printf("2. %f %i64x",s1.d,s2.l);

//--

s2.l=0x7ff7000000000000; // 最大 nonnumber snan

s1=s2;

printf("3. %f %i64x",s1.d,s2.l);

//--

s2.l=0x7ff8000000000000; // 最小 nonnumber qnan

s1=s2;

printf("4. %f %i64x",s1.d,s2.l);

//--

s2.l=0x7fff000000000000; // 最大 nonnumber qnan

printf("5. %f %i64x",s1.d,s2.l);

//--

s2.l=0x7ff0000000000000; // 正無窮大 1.#inf 和最小 nnonnumber snan

s1=s2;

printf("6. %f %i64x",s1.d,s2.l);

//--

s2.l=0xfff0000000000000; // 負無窮大 1.#inf

s1=s2;

printf("7. %f %i64x",s1.d,s2.l);

//--

s2.l=0x8000000000000000; // 負零 0.0

s1=s2;

printf("8. %f %i64x",s1.d,s2.l);

//--

s2.l=0x3fe0000000000000; // 0.5

s1=s2;

printf("9. %f %i64x",s1.d,s2.l);

//--

s2.l=0x3ff0000000000000; // 1.0

s1=s2;

printf("10. %f %i64x",s1.d,s2.l);

//--

s2.l=0x7fefffffffffffff; // 最大的規格化數字 (max_dbl)

s1=s2;

printf("11. %.16e %i64x",s1.d,s2.l);

//--

s2.l=0x0010000000000000; // 最小的正規格化 (min_dbl)

s1=s2;

printf("12. %.16e %.16i64x",s1.d,s2.l);

//--

s1.d=0.7; // 顯示數字0.7-無限迴圈部分

s2=s1;

printf("13. %.16e %.16i64x",s1.d,s2.l);

/* 1. -1.#ind00 fff8000000000000

2. -1.#qnan0 ffff000000000000

3. 1.#snan0 7ff7000000000000

4. 1.#qnan0 7ff8000000000000

5. 1.#qnan0 7fff000000000000

6. 1.#inf00 7ff0000000000000

7. -1.#inf00 fff0000000000000

8. -0.000000 8000000000000000

9. 0.500000 3fe0000000000000

10. 1.000000 3ff0000000000000

11. 1.7976931348623157e+308 7fefffffffffffff

12. 2.2250738585072014e-308 0010000000000000

13. 6.9999999999999996e-001 3fe6666666666666

*/

MQL5 學習筆記

mql5的英文文件有5000多頁,編寫的真是相當的棒!現在財經日曆也能嵌入到程式設計裡面了,對於ea來說,無疑是乙個福音。今天在智慧型交易上看了mql5試聽課,覺得老師還是挺有料的,等我學完智慧型課程之後給大家匯報。mql5主要吸引我的一點就是多執行緒,和很方便的順勢加倉。最近也訂閱了mt官網的郵件...

MQL5語法基礎(四)

字元作為mql5中的字串要素是統一字元設定的指數。它們是可以轉換成整數的十六進製制值,可以像加減法定理一樣進行整數操作 引號裡的任何單一特質和十六進製制的 ascii x10 都能當做字元常量無符號短整型型,例如,0型記錄的數值是30,相當於在圖示字元中代表調整歸零。void onstart 在程式...

MQL5 日期時間型和顏色型

日期時間型是為儲存日期時間型預留的,開始日期是1970年1月1日,佔8位元組記憶體。日期時間型常量可被當做數字串,由 6 個部分的字元組成 年 月 日 或是日 月 年 時 分 秒,資料以 d 開頭,用單引號括起。日期 年 月 日 時間 時 分 秒 或是一起被省略,值起於1970年1月1日,止於300...