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

 
Nikolai Semko :


물론 당신 말이 맞아. 그러나 나는 반복할 것이다. 99.9%의 작업에서 (int) 또는 (long)으로의 분수 유형 변환을 사용하여 반올림 함수를 대체 빠른 옵션으로 교체하는 것은 절대적으로 합법적입니다. 숙련된 프로그래머는 이 사실을 알고 적절할 때 적용하기만 하면 됩니다.

99%의 경우 반올림을 전혀 신경쓰지 않아도 됩니다. 가격 비교를 위해 다음과 같은 말도 안되는 소리가 있습니다.

 // 0 - first is greater than second
// 1 - equal
// 2 - second is greater than first
uchar compare_prices( double first, double second)
{
   if (first - second >= _Point )
       return 0 ;
   if (second - first >= _Point )
       return 2 ;

   first = round (first/ _Point );
   second = round (second/ _Point );
   
   if (first > second)
       return 0 ;
   if (first < second)
       return 2 ;
   return 1 ;
}

속도를 측정하지는 않았지만 대부분의 경우 원형()에 도달하지 않는 것을 볼 수 있습니다.

 
Nikolai Semko :

참조

x = 3(임의의 정수)일 때 엉망입니다 :))

내 공식에서 또는 당신의 공식에서?

감사합니다.
 
Andrey Kisselyov :
내 공식에서 또는 당신의 공식에서?

감사합니다.

내 오래된 것에서 :

y= ceil (x);  -> y=( int )(x+ 1 );

그리고 당신의:

y= ceil (x);  -> y=( int )(x)+ 1 ;

x=3의 경우 두 경우 모두 잘못된 값 4가 있습니다.

및 옵션:

y= ceil (x);  -> y=( int )(x+ 0.9999999999999997 );

최대 실행 속도를 유지하면서 지금까지 가장 정확합니다.

 
Nikolai Semko :

내 오래된 것에서 :

그리고 당신의:

x=3의 경우 두 경우 모두 잘못된 값 4가 있습니다.

그리고 옵션:

최대 실행 속도를 유지하면서 지금까지 가장 정확합니다.

정수가 입력에 제공될 때 이 공식이 필요한 이유는 무엇입니까?

감사합니다.

추신 : 훌륭한 프로그래머가 되려면 모든 곳에 있는 것은 아니고 항상 모든 종류의 가속 기능을 밀어야 하는 것은 아니며 작업과 작업에 사용하는 알고리즘에 따라 다르다는 점을 이해해야 합니다.
 
Andrey Kisselyov :

정수가 입력에 제공될 때 이 공식이 필요한 이유는 무엇입니까?

감사합니다.


글쎄, 당신은 그것이 전체인지 아닌지 알 수 없습니다. 이중 숫자가 정수가 될 수 있습니다.

 
Andrey Kisselyov :

추신 : 훌륭한 프로그래머가 되려면 모든 곳에 있는 것은 아니고 항상 모든 종류의 가속 기능을 밀어야 하는 것은 아니며 작업과 작업에 사용하는 알고리즘에 따라 다르다는 점을 이해해야 합니다.

틀림없이. 그래서 "적절할 때 사용"이라고 썼습니다.
 
Nikolai Semko :

글쎄, 당신은 그것이 전체인지 아닌지 알 수 없습니다. 이중 숫자가 정수가 될 수 있습니다.

그런 다음 입구에 있는 숫자에 대한 옵션 아래에 즉시 정원을 울타리로 묶으십시오.
 if (x-( int )(x)> 0 )y=( int )(x)+ 1 ;
else y=x;

감사합니다.

PS double은 정의상 정수가 될 수 없으며 기계 메모리의 숫자 표현은 변경되지 않습니다.
 
Andrey Kisselyov :
그런 다음 입구에 있는 숫자에 대한 옵션 아래에 즉시 정원을 울타리로 묶으십시오.

감사합니다.


그렇기 때문에 정원에 울타리를 치지 않도록:

 if (x-( int )(x)> 0 )y=( int )(x)+ 1 ;
else y=x;

쓰기 쉬움:

y=( int )(x+ 0.9999999999999997 );

그 쯤

 #define _ceil(x)  ( int )((x)+ 0.9999999999999997 )
...
y=_ceil(x);
 
Nikolai Semko :

이 정원에 울타리를 치지 않도록:

쓰기 쉬움:

~에
1- 0.9999999999999998

당신은 아무것도 얻지 못할 것입니다.
이 접근 방식을 사용하면 어떤 경우에도 공식이 올바르지 않은 숫자를 찾을 수 있습니다. 정원은 울타리를 쳐야 합니다.

감사합니다.

 
Andrey Kisselyov :
~에

당신은 아무것도 얻지 못할 것입니다.
이 접근 방식을 사용하면 어떤 경우에도 공식이 올바르지 않은 숫자를 찾을 수 있습니다. 정원은 울타리를 쳐야 합니다.

감사합니다.


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

반복하지 않도록 이 주제를 다시 읽을 것을 권합니다.