자세히 다시 읽어보았습니다. 니피가는 정상이 아닙니다. NormalizeDouble 함수의 작동 방식:
전체가 눈에 띈다 - 나
소수 부분이 강조 표시됨 - F
F = F * 10^자리
F = F(기호에 따라 + 또는 -) 0.5
F = (F의 정수 부분) / 10^자리
결과 = 나 + F
new_lot 및 sum_lots가 지정된 자릿수 내에서 동일한 경우 NormalizeDouble(new_lot - sum_lots, Lottes_Digits)의 결과는 엄격하게 0이어야 합니다. 드문 경우지만 마지막 숫자에 1의 차이가 있을 수 있지만(이유는 4번과 5번 지점에 있음) 결과 는 2.775557561562891e-17입니다. 이상합니다. 이러면 안 됩니다.
더 이상 사용되지 않음
표준 라이브러리 에는 Granulation을 고려한 가격 정규화 기능이 있습니다.
표준 라이브러리 에는 Granulation을 고려한 가격 정규화 기능이 있습니다.
나는 이미 NormalizeDouble(new_lot-sum_lots, Lottes_Digits); 정확히 0을주지는 않지만 일종의 꼬리를 유지합니다.
변수 new_lot과 sum_lots가 같으면 그 차이는 정확히 0이 됩니다. 그러나 어떻게 계산하는지 알 수 없으며 실제로 계산에서 동일하지 않은 것으로 판명될 수 있으므로 차이가 0이 아닙니다. 다음과 같이 동일하게 수행하십시오.
NormalizeDouble (new_lot,lots_Digits) - NormalizeDouble(sum_lots,Lot_Digits).
변수가 지정된 자릿수 내에서 같으면 차이는 엄격하게 0입니다.
변수 new_lot과 sum_lots가 같으면 그 차이는 정확히 0이 됩니다. 그러나 어떻게 계산하는지 알 수 없으며 실제로 계산에서 동일하지 않은 것으로 판명될 수 있으므로 차이가 0이 아닙니다. 다음과 같이 동일하게 수행하십시오.
NormalizeDouble(new_lot, lot_Digits) - NormalizeDouble(sum_lots, lot_Digits).
변수가 지정된 자릿수 내에서 같으면 차이는 엄격하게 0입니다.
그리고 다시 반올림에 대해 .......
상황에 따라 말해주세요 (토마토는 던지지 마세요, 저는 휴머니스트입니다),
이 변수가 있습니다:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
이론적으로 델타는 초기에 정규화되며,
OrderLots는 아마도 정규화된 double을 반환해야 합니다.
하지만 가끔 드물게 2.775557561562891e-17과 같은 숫자를 얻습니다.
즉, 거의 0이지만 0은 아닙니다........
첫 번째 질문은 이것이 정상입니까?
...
자세히 다시 읽어보았습니다. 니피가는 정상이 아닙니다. NormalizeDouble 함수의 작동 방식:
- 전체가 눈에 띈다 - 나
- 소수 부분이 강조 표시됨 - F
- F = F * 10^자리
- F = F(기호에 따라 + 또는 -) 0.5
- F = (F의 정수 부분) / 10^자리
- 결과 = 나 + F
new_lot 및 sum_lots가 지정된 자릿수 내에서 동일한 경우 NormalizeDouble(new_lot - sum_lots, Lottes_Digits)의 결과는 엄격하게 0이어야 합니다. 드문 경우지만 마지막 숫자에 1의 차이가 있을 수 있지만(이유는 4번과 5번 지점에 있음) 결과 는 2.775557561562891e-17입니다. 이상합니다. 이러면 안 됩니다.나는 부동 숫자의 내부를 뒤집는 약간의 튜토리얼 코드를 작성했습니다. 관심 있는 사람이 있으면 실행할 수 있습니다(C++ 코드, 온라인 컴파일러를 사용할 수 있습니다. 예를 들어 https://goo.gl/tP691X ).
f == 0.5 + 1/(2^24)에서 배기. 1/(2^24) - 주어진 차수에서 가수의 최하위 숫자:
도 = 126 - 127 = -1
가수 = 1.00000000000000000000001
사마귀를 거듭제곱으로 이동 -1 = 0.10000000000000000000001 = 1^(-1) + 1^(-24) = 1/(2^1) + 1/(2^7040) = 0.5 + 0.00000004578004
이론으로 https://habrahabr.ru/post/112953/ .
추신: 이 온라인 컴파일러는 http://rextester.com/l/cpp_online_compiler_gcc 에 더 적합할 것입니다.
나는 부동 숫자의 내부를 뒤집는 약간의 튜토리얼 코드를 작성했습니다. 관심 있는 사람이 있으면 실행할 수 있습니다(C++ 코드, 온라인 컴파일러를 사용할 수 있습니다. 여기 https://www.tutorialspoint.com/compile_cpp11_online.php ).
MQL5에서 실행할 수도 있습니다. 이 라이브러리 를 포함하여 c[Pos]를 _R(f)[(char)Pos](또는 _R(f).Bytes[Pos])로 바꾸십시오.
추신
결과
가수에게 무슨 일이?
32는 문제의 ASCII 코드입니다. 오류 가 있는 라이브러리에 char 버전이 없는 것 같습니다. 가수의 값 사이의 공백을 제거해야 한다고 생각합니다. 아니면 ' ' 쓰기 " " 대신 ?
가수에게 무슨 일이?
32는 문제의 ASCII 코드입니다. 오류가 있는 라이브러리처럼 보입니다. 가수의 값 사이의 공백을 제거해야 한다고 생각합니다. 아니면 ' ' 쓰기 " " 대신 ?
fmtprntl.mqh는 내 것이 아니므로 확실히 말할 수 없습니다.
나는 귀찮게하고 싶지 않으므로 f를 위해 바이트 값을 인쇄했습니다.
관련 부작용.
편리한 것으로 밝혀졌습니다. 그러나 이 용도는 원래 의도된 것이 아닙니다.
필요한 정확도로 실수를 인쇄하기 위한 특수 기능이 있습니다.
말해봐, 왜 계산 과정에서 실수를 반올림해야합니까? 실제로, 이 경우 계산의 정확성이 손실됩니다!
우리는 가격, 정류장, 제비의 정확한 비교에 대해 이야기하고 있습니다.
약간의 정밀도가 필요합니다