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

 
pavlick_ :

왜 오래 캐스팅하지 않습니까? 오버플로가 가능하지만 int를 오버플로하는 것이 훨씬 쉽습니다.


물론 필요한 경우 길게 할 수도 있습니다.

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

x=3;

y=3; y=4;

 
Nikolai Semko :

물론 필요한 경우 길게 할 수도 있습니다.

따라서 방법을 광고하면 어리석게 복사됩니다. 일반적으로 검사 없이는 다음과 같이 캐스팅할 수 없습니다. 이것은 UB입니다.

실수 부동 유형의 유한 값이 _Bool이 아닌 정수 유형으로 변환되면 소수 부분이 삭제됩니다(즉, 값이 0으로 잘림). 정수 형식으로 정수 부분의 값을 표현할 수 없는 경우 동작이 정의되지 않습니다.
보증금이 병합되거나 다른 일을 할 수도 있습니다))
 
pavlick_ :

따라서 방법을 광고하면 어리석게 복사됩니다. 일반적으로 검사 없이는 다음과 같이 캐스팅할 수 없습니다. 이것은 UB입니다.

보증금이 병합되거나 다른 일을 할 수도 있습니다.))

나는 아무것도 광고하지 않습니다. 아이디어를 공유합니다. 그것이 바로 이 포럼과 토론을 위한 것입니다.

 
Dmitry Fedoseev :

x=3;

y=3; y=4;


바로 그거죠! spsb. 천장으로 무엇을 할 수 있는지 생각해야합니다.

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

드미트리 페도세예프 :

x=3;

y=3; y=4;

옵션으로 아름답지는 않지만 속도는 동일합니다.

y= ceil (x);  -> y=( int )(x+ 0.999999999999999 );
 #define _ceil(x)  ( int )((x)+ 0.999999999999999 )

double x= 3 ;
int y=_ceil(x);
 
 
Nikolai Semko :

옵션으로 아름답지는 않지만 속도는 동일합니다.

그러면 x + 1 - DBL_MIN 이 더 좋을 것입니다. x + 1 - DBL_EPSILON. 나는 테스트하지 않았습니다. 시도하십시오.

음수는 어떻습니까? 결국 천정과 바닥이 달라야 합니다.

 
Alexey Navoykov :

그러면 x + 1 - DBL_MIN 이 더 좋을 것입니다. x + 1 - DBL_EPSILON. 나는 테스트하지 않았습니다. 시도하십시오.

음수는 어떻습니까? 결국 천정과 바닥이 달라야 합니다.

DBL_MINDBL_EPSILON이 작동하지 않습니다. 너무 작습니다. 아마도 0.9999999999999999를 떠나는 것이 합리적 일 것입니다 (16 아홉은 최대 소수점 자리의 두 배입니다)

네, 맞습니다. 음수에는 다른 알고리즘이 있어야 합니다. 고맙습니다! 첫글에 추가하겠습니다.

누가 상관 - 음수로 문제를 해결하는 방법에 대해 생각할 수 있습니다. 나는 개인적으로 관심이 없다, t. 내 모든 작업에는 양수가 포함됩니다.

 
Nikolai Semko :

아마도 0.9999999999999999를 떠나는 것이 합리적 일 것입니다 (16 아홉은 최대 소수점 자리의 두 배입니다)

 void OnStart ()
{
         Print (( int )( 3.0 + 0.9999999999999999 ));
}
결과를 확인 했습니까?
 

A100 :

 void OnStart ()
{
         Print ( ( int )( 3 + 0.9999999999999999 ));
}


예, 하지만 다음과 같은 경우:

x= 3 ;
int Y=( int ) ceil (x);
Print (Y);
Y=( int )(x+ 0.999999999999999 );
Print (Y);

모든 것이 정상입니다. 컴파일러가 궁금합니다. :))

사유: