ceil(), round(), floor() 함수의 실행 속도 - 페이지 6

 
Nikolai Semko :

나는 이미 여기 에 대해 썼습니다.

확인. 내가 알기로는 이 터미널의 프레임워크 내에서 작성하고 지정된 정확도 내에서 다른 장치나 플랫폼에서 코드를 이식하고 실행하는 데 관심이 없습니다.

감사합니다.

추신: 훌륭한 프로그래머는 하드웨어와 프로그램이 변경될 수 있으며 향후 오류를 방지할 필요가 있음을 이해해야 합니다. 당신의 것과 같은 문제 문장을 가지고, 당신이 그 당시에 오류가 없다고 생각할 함수에서 오류를 찾는 것이 미래에 쉽지 않을 수 있습니다.
 
Andrey Kisselyov :
확인. 내가 알기로는 이 터미널의 프레임워크 내에서 작성하고 설정된 정확도 내에서 다른 장치나 플랫폼에서 코드를 이식하고 실행하는 데 관심이 없습니다.

감사합니다.

정확히. 우리는 MQL5에 대해 이야기하고 있습니다(MQL4도 마찬가지일 수 있음 - 확인하지 않음). 또한 클래스 또는 알고리즘 내의 코드는 MQL 내에서 완벽하게 전송됩니다. 그러나 C++에서도 작동합니다. 나는 이미 예를 가지고 있습니다.

 
Andrey Kisselyov :

추신: 훌륭한 프로그래머는 하드웨어와 프로그램이 변경될 수 있으며 향후 오류를 방지할 필요가 있음을 이해해야 합니다. 당신의 것과 같은 문제 문장을 가지고, 당신이 그 당시에 오류가 없다고 생각할 함수에서 오류를 찾는 것이 미래에 쉽지 않을 수 있습니다.
이 상황에서는 당신이 말하는 변화를 상상조차 할 수 없습니다. 계산(int)(x+0.5)의 수학으로 무엇을 변경할 수 있습니까? 분수 부분 또는 무엇을 버리는 것을 중단합니까?
 
Nikolai Semko :
이 상황에서는 당신이 말하는 변화를 상상조차 할 수 없습니다. 계산(int)(x+0.5)의 수학으로 무엇을 변경할 수 있습니까? 분수 부분 또는 무엇을 버리는 것을 중단합니까?

예를 들어, 새로운 데이터 유형 이 도입됩니다...

 
STARIJ :

예를 들어, 새로운 데이터 유형 이 도입됩니다...

))) 예, 하지만 이전 데이터 유형이 취소되면 코드가 작동을 멈춥니다....
 
나는이 혼란에 대해 이야기하고있다
y=( int )(x+ 0.9999999999999997 );

예를 들어 보겠습니다.
기계의 비트 수를 변경하고 64비트로 전환하고 기계의 정확도가 증가하더라도 기계의 정확도가 오류에서 설정한 것보다 훨씬 더 높기 때문에 공식이 작동을 멈춥니다.

감사합니다.

추신: 특정 수의 수에서 수식이 실패하는 다른 옵션이 있을 수 있습니다. 다른 기계로의 전환이나 사용자가 알지 못한 컴파일러의 변경으로 인해, 또는 기계에서 숫자의 표현이 변경되었을 때, 또는 컴파일할 때 숫자의 소수 부분의 감소로 인해 지속적으로 오류를 선택합니다. 터미널의 새 버전 ... 그러나 무엇을 변경할 수 있는지 결코 알 수 없습니다. 그다지 좋지 않은 것 같습니다. IF를 만들거나 오류를 반복해서 작성하여 다음에 일어날 일을 추측하십시오 ...

생각해 볼 것이 있다고 생각합니다.

 
Andrey Kisselyov :

...

PS double은 정의상 정수가 될 수 없으며 기계 메모리의 숫자 표현은 변경되지 않습니다.

double 형식이 정수 데이터 형식에 적용되지 않고 정수 값이 있는 숫자를 double 형식 변수에 저장할 수 없다는 사실에 대해 이야기하고 있습니까? 이중이 발생하는 정수입니다.

 

컴퓨터에서 구현된 반올림이 합산 후 가장 단순한 컷과 어떻게 다른지에 대한 간단한 설명을 찾았습니다. 14년 전, http://delphimaster.net/view/14-10885/all :

톨릭 ( 2003-08-13 11:04 ) [11]

이러한 반올림은 회계에서 허용됩니다. 따라서 세무서도 이 반올림을 적용하므로 모든 것이 최소한 종이로 수렴되어야 합니다. :))



다이아몬드샤크 ( 2003-08-13 11:20 ) [12]

오호호... 한 번 더.
숫자의 분포가 균일한 난수에 가깝다고 가정해 봅시다. 그런 다음 "산술" 반올림을 통해 다음을 얻습니다.

자릿수 정확도
0 0
열하나
2-2
3-3
4-4
5+5
6+4
7+3
8+2
9+1

쉽게 볼 수 있듯이 합계해야 하는 숫자의 배열이 큰 경우(문서 위치, 계정 잔액 등의 합계) "산술" 반올림을 사용하면 예상과의 체계적인 오류가 발생합니다. 축적하다
0.5*10^n*0.1*N
어디:
n -- 반올림이 수행되는 자릿수의 10진수 가중치(최대 두 자릿수 n=-2, 정수 n=0 등)
0.1 -- 각 숫자의 확률
N -- 배열에서 합산된 숫자의 수

오류 확률을 균등화하기 위해 보상되지 않은 유일한 오류(위 표 참조) +5를 보상해야 합니다. 이를 위해 이전 그림의 패리티에 따라 2개의 동등하게 확률 +5 -5로 인위적으로 나뉩니다.

그런데 FPU 상태 워드에는 반올림 모드(산술/회계)를 제어하는 플래그가 있습니다.


견적 종료

다른 하나, http://delphimaster.net/view/15-1340952214/all : "12.5와 13.5를 반올림하면 다른 결과가 나오는 이유를 일반 사용자(관리자/회계사)에게 설명할 수 없기 때문입니다."


반올림 함수의 "가속된" 버전을 사용자에게 제공하면 추가할 때 오류가 증가한다는 점을 강력하게 경고해야 합니다. 우리는 매우 다른 상황에서 이 오류를 주의 깊게 평가해야 합니다. 이것은 오류가 누적되어 위험합니다. 반올림만으로 프로세서 부하의 비율이 너무 중요하여 이 경우 누적된 오류를 잊어버릴 수 있는 예를 찾기가 어렵습니다.

Округление чисел. Неужели ТАК правильно???
  • delphimaster.net
3-10545           Kati                  2003-08-12 10:13  2003.09.04   обновление SQL запроса 14-10898          kalishenko            2003-08-14 20:09  2003.09.04   Win2000 Server и доступ в Интернет 1-10692           lww                   2003-08-20 10:30  2003.09.04   Как написать dll для 1С? 1-10813           koks                  2003-08-20...
 

Andrey Kisselyov :
я говорю про вот это безобразие

y=( int )(x+ 0.9999999999999997 );

자, 우수한 학생 여러분, 설득했습니다. 나는 당신을 위해 ceil 기능을 변경하고 있습니다:

y= ceil (x);  ->  y=(x-( int )x> 0 )?( int )x+ 1 :( int )x;
или через дефайн:
#define _ceil(x) (x-( int )x> 0 )?( int )x+ 1 :( int )x

이 변형은 변형보다 25-50% 더 느립니다. y=( int )(x+ 0.9999999999999997 ); 그러나 반면에 가능한 한 정확하고 음수에 대해서도 동일하게 작동하며 동시에 여전히 ceil(x) 함수보다 약 3배 빠릅니다.

그러나 평민이자 C 학생인 나 자신은 9와 함께 옵션을 사용할 것입니다. 왜냐하면 나는 당신의 모든 주장이 지루하다고 생각하고 오랫동안 어셈블러로 프로그래밍을 해왔고 따라서 컴파일 후 코드에 어떤 일이 일어날지 상상하는 사람으로서, 당신이 그것들 없이 할 수 있는 곳에 검사를 하는 것은 과잉입니다.

 

양수 및 음수 변형:

 #define _ceil(x) (x-( int )x> 0 )?( int )x+ 1 :( int )x
#define _round(x) (x> 0 )?( int )(x+ 0.5 ):( int )(x- 0.5 )
#define _floor(x) (x> 0 )?( int )x:(( int )x-x> 0 )?( int )x- 1 :( int )x
이것은 이미 3~4배의 속도 향상을 제공하는 ceil(), round(), floor() 함수에 대한 본격적인 대체를 위한 응용 프로그램인 것 같습니다.
사유: