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

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

방금 당신이 말한 것을 따라 잡았습니다.
나는 당신이 주제에 있지 않다는 내 말을 철회합니다. 양해를 구합니다.
예, 해당 옵션은 이중 숫자가 -9007199254740992에서 9007199254740992(2의 53승(가수의 비트 수)) 범위에 있다는 전제 하에 사용할 수 있습니다.

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

이것이 옵션이라면?

 double Ceil ( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}

결과:

 2018.08 . 26 10 : 49 : 23.552 TestRound (Crypto.ALT,M10)      Время цикла без округления = 1.317 наносекунд, сумма = 115583114403605978808320.00000000
2018.08 . 26 10 : 49 : 23.556 TestRound (Crypto.ALT,M10)      Время выполнения функции ceil =   2.129 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.557 TestRound (Crypto.ALT,M10)      Время выполнения функции Ceil =   0.100 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.560 TestRound (Crypto.ALT,M10)      Время выполнения функции floor = 1.299 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.561 TestRound (Crypto.ALT,M10)      Время выполнения функции Floor = 0.120 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.564 TestRound (Crypto.ALT,M10)      Время выполнения функции round = 1.787 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.566 TestRound (Crypto.ALT,M10)      Время выполнения функции Round = 0.106 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 10 : 49 : 23.566 TestRound (Crypto.ALT,M10)      Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать

테스트가 완전한 정체성을 보여주는 것처럼.

사실, 범위가 확인되는 이 버전에서 대체 솔루션의 속도는 약 2배(3-8이 아님)만 더 높지만 이는 이중 숫자가 -9007199254740992에서 9007199254740992 범위에 있는 경우입니다. 그러나 이 범위를 벗어나면 훨씬 더 높습니다.

파일:
TestRound.mq5  9 kb
 
Nikolai Semko :


테스트가 완전한 정체성을 보여주는 것처럼.

사실, 이 옵션은 nan, snan 값을 사용할 때 이중 입력 변수의 오버플로를 고려하지 않습니다.

이를 고려해야 하는 경우 여전히 하나의 수표를 삽입할 수 있지만 여전히 이 옵션은 원래 기능보다 빠르게 작동합니다.

 double Ceil ( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((! MathIsValidNumber (x) || x> 9007199254740992 || x<- 9007199254740992 )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}
 
Nikolai Semko :

테스터/옵티마이저용 Expert Advisor를 다운로드하십시오. 이것은 실제로 속도가 중요한 곳입니다.

 
fxsaber :

테스터/옵티마이저용 Expert Advisor를 다운로드하십시오. 이것은 실제로 속도가 중요한 곳입니다.

많은 사람들이 알다시피 저는 앤티 앨리어싱 그래픽도 처리합니다. 반올림 기능을 적극적으로 사용하는 것은 매끄러운 그래픽과 각 픽셀의 작업을 위한 것입니다.

전에는 반올림 함수가 double의 제곱근을 취하는 것보다 느리다는 것을 상상조차 할 수 없었습니다.
이러한 이유로 내가 이 나노초를 내쉬기 시작했습니다. 평활화된 그래프의 이러한 나노초는 각 프레임에서 밀리초로 바뀔 수 있고 프레임은 33밀리초마다 변경될 수 있기 때문입니다.

 
Nikolai Semko :

많은 사람들이 알다시피 저는 앤티 앨리어싱 그래픽도 처리합니다. 반올림 기능을 적극적으로 사용하는 것은 매끄러운 그래픽과 각 픽셀의 작업을 위한 것입니다.
이러한 이유로 내가 이 나노초를 내쉬기 시작했습니다. 평활화된 그래프의 이러한 나노초는 각 프레임에서 밀리초로 바뀔 수 있고 프레임은 33밀리초마다 변경될 수 있기 때문입니다.

물론 이것은 그래픽에 중요합니다. 따라서 매우 오랫동안 거의 모든 일반 작업에 대한 알고리즘 최적화가 있었습니다.

 
fxsaber :

물론 이것은 그래픽에 중요합니다. 따라서 매우 오랫동안 거의 모든 일반 작업에 대한 알고리즘 최적화가 있었습니다.

당신은 잘못. 아직 쟁기질한 밭이 없고 쟁기질한 것이 닫혀 있습니다. MQL에서는 더욱 그렇습니다. CCanvas 클래스는 최적성과는 거리가 멀고 부드러움이 거의 없고 부드러움이 있는 것은 불만족스럽습니다.

 

LONG_MAX/MIN 을 사용하지 않는 이유는 무엇입니까? 어떻게 든 더 좋아 보일 것입니다. 아무것도 아닌 것 같습니다. 나는 당신의 테스트를 gcc에서 실행했습니다.

1. -O3로 컴파일

Время цикла без округления = 0.001099185 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции ceil =   0.004310106 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Ceil =   0.001912712 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции floor =   0.005283493 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Floor =   0.002031304 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции round =   0.005308409 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Round =   0.002344382 секунд, сумма = 1.15583114 e+ 23

2. -Ofast로 컴파일하기

Время цикла без округления = 0.000552652 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции ceil =   0.001720999 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Ceil =   0.00189282 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции floor =   0.001430063 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Floor =   0.001979336 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции round =   0.001698521 секунд, сумма = 1.15583114 e+ 23
Время выполнения функции Round =   0.001944874 секунд, сумма = 1.15583114 e+ 23

귀하의 코드에서 시간 계산은 정크입니다. 출력은 밀리초(나노가 아님) 단위이며 마이너스 t0이 필요한 이유를 여전히 이해하지 못합니다.

 Print ("Время выполнения функции ceil =  "+ DoubleToString (( double )( GetMicrosecondCount ()-t-t0)/ 1000 , 3 )+" наносекунд, Контрольная сумма = "+ string (s));
 
Nikolai Semko :

당신은 잘못. 아직 쟁기질한 밭이 없고 쟁기질한 것이 닫혀 있습니다.

그는 세계 경험에 대해 말했습니다. 그래프가 있는 주제별 포럼의 알고리즘을 살펴보세요. 데모합니다. 사람들은 빠른 알고리즘을 공유합니다.

 
fxsaber :

그는 세계 경험에 대해 말했습니다. 그래프가 있는 주제별 포럼의 알고리즘을 살펴보세요. 데모합니다. 사람들은 빠른 알고리즘을 공유합니다.

링크 내려주세요