표준 기능/접근법의 대체 구현 - 페이지 7

 
pavlick_ :

double을 정수로 변환하는 것은 (따라서) 형편없는 코드이기 때문입니다. round with friend는 float에서 정수 유형을 가져오도록 설계되지 않았습니다.

글쎄, 누가 함수 유형을 이중으로 바꾸는 것을 막고 있습니까?
그리고 당신의 말을 통제하십시오.
 
Nikolai Semko :
글쎄, 누가 함수 유형을 이중으로 바꾸는 것을 막고 있습니까?
그리고 당신의 말을 통제하십시오.

어떤 공격도 말했다. 정수로 변환하기 위해서는 온갖 종류의 rint, lrint, llrint가 있습니다. 결국, 그것들은 long(double)을 훨씬 더 간단하게 만들 수 있을 때 발생하지 않았습니다. float를 정수로 변환하는 것은 개념적 오류입니다.

 
pavlick_ :

어떤 공격도 말했다. 정수로 변환하기 위해서는 온갖 종류의 rint, lrint, llrint가 있습니다. 결국, 그것들은 long(double)을 훨씬 더 간단하게 만들 수 있을 때 발생하지 않았습니다. float를 정수로 변환하는 것은 개념적 오류입니다.

아 주제를 벗어났군요...
 
Nikolai Semko :
아 주제를 벗어났군요...

좋아, UB는 당신의 손에 달려 있습니다.

 
fxsaber :
그럼 애매한 해석. 하나의 함수 호출 의 평균 시간이 아니라 주기 시간이 표시되도록 결정했습니다.

승리는 3-8 번입니다.

아마도 함수의 실행 시간을 계산하는 방법이 완벽하지는 않지만 상당히 객관적입니다. 그러나 누군가가 더 좋고 객관적인 옵션을 제공한다면 그것은 당연할 것입니다.

그럼에도 불구하고 double 유형에 대한 완전한 유추를 위해 변경되었습니다.

 double Ceil ( double x) { return double ((x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);} 
2018.08 . 25 22 : 16 : 01.309 TestRound (EURUSD,M10)  Время цикла без округления = 1.315 наносекунд, сумма = 5249993749.98145962
2018.08 . 25 22 : 16 : 01.309 TestRound (EURUSD,M10)  Время выполнения функции sqrt = 0.628 наносекунд, сумма = 81969849.90928555  // даже квадратный корень вычисляется в несколько раз быстрее чем штатные функции округления
2018.08 . 25 22 : 16 : 01.313 TestRound (EURUSD,M10)  Время выполнения функции ceil =   2.037 наносекунд, Контрольная сумма = 5250492895.0
2018.08 . 25 22 : 16 : 01.315 TestRound (EURUSD,M10)  Время выполнения функции Ceil =   0.587 наносекунд, Контрольная сумма = 5250492895.0
2018.08 . 25 22 : 16 : 01.318 TestRound (EURUSD,M10)  Время выполнения функции floor = 2.247 наносекунд, Контрольная сумма = 5249492896.0
2018.08 . 25 22 : 16 : 01.320 TestRound (EURUSD,M10)  Время выполнения функции Floor = 0.385 наносекунд, Контрольная сумма = 5249492896.0
2018.08 . 25 22 : 16 : 01.323 TestRound (EURUSD,M10)  Время выполнения функции round = 1.610 наносекунд, Контрольная сумма = 5249992896.0
2018.08 . 25 22 : 16 : 01.324 TestRound (EURUSD,M10)  Время выполнения функции Round = 0.181 наносекунд, Контрольная сумма = 5249992896.0

개발자가 일반 함수에서 이 알고리즘을 사용하는 것이 좋습니다.

파일:
TestRound.mq5  7 kb
 
)). 이것은 가치 범위에 대한 정확한 지식이 있는 개인 공예품의 장소일 수 있지만 표준 라이브러리는 아닙니다. 확립된 기능은 바보에 의해 작성되지 않습니다. 가장 똑똑하다고 생각하지 마십시오. 여기에서도 친구가 정의되지 않은 동작과 지정되지 않은 동작에 대해 썼는데 https://www.linux.org.ru/forum/development/14422428#comments 가 잘못 작동한다는 사실에 놀랐습니다. 그리고 실제 알고리즘(그리고 베어 사이클이 아님)에서 몇 나노초의 이 모든 절약은 눈에 띄지 않을 것입니다.
 

그리고 왜 반올림 함수가 double을 반환해야 하는지 이해가 되지 않습니다. 제 생각에는 부동 값에서 정수를 얻는 방법을 결정해야 하는 것이 반올림의 요점입니다.

변환의 "개념적 오류"는 무엇입니까 - 저도 완전히 명확하지 않습니다.

 
Georgiy Merts :

그리고 왜 반올림 함수가 double을 반환해야 하는지 이해가 되지 않습니다. 제 생각에는 부동 값에서 정수를 얻는 방법을 결정해야 하는 것이 반올림의 요점입니다.

변환의 "개념적 오류"는 무엇입니까 - 저도 완전히 명확하지 않습니다.

정수 외부에서 무엇을 얻을 수 있는지 생각해 보십시오.
 
fxsaber :

NormalizeDouble

결과는 1123275 및 1666643으로 MyNormalizeDouble을 선호합니다(최적화=1). 최적화 없이 - 4배 더 빠릅니다(메모리의 경우).


나는 항상 당신에게 묻고 싶었습니다. 당신의 코드 스타일 로 많은 것을 프로그래밍할 수 있습니까?

작업이 가장 복잡한 메커니즘을 독립적으로 개발하고 생성하도록 설정된 경우 코드 작성 방법을 사용할 가치가 있습니까? 또한 모든 단계에서 각 레코드의 성능을 확인하십시오.

당신의 스타일과 수준에서 이 프로세스에 접근한다면 개발자가 코드를 읽고/쓰기/확인하는 데 얼마나 걸립니까?

내가 생각한 것의 절반을 쓰지 않고 늙어갈 것이라고 장담합니다.


추신 주제넘어서 죄송합니다. 프로그래밍 스타일은 모든 사람의 개인적인 문제입니다. 그러나 특정 단계에서 코드는 정확히 노동 생산성 을 위해 가능한 한 읽을 수 있어야 한다는 것을 이해하기 시작합니다.

Productivity - США - MetaTrader 5
Productivity - США - MetaTrader 5
  • www.metatrader5.com
Индекс производительности труда показывает изменение объема выпущенной продукции, приходящегося на одного работника. Этот показатель полезен для предсказания инфляции и прироста объема производства. Если стоимость труда увеличивается соответственно увеличению производительности, и, кроме того, маловероятно увеличение производственных издержек...
 
Реter Konow :

나는 항상 당신에게 묻고 싶었습니다. 당신의 코드 스타일 로 많은 것을 프로그래밍할 수 있습니까?

내 스타일의 예?