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

 
Nikolai Semko :

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

모든 것이 정상입니다.

모든 숫자 x에 대해 모든 것이 잘 될 것인지 확인하는 것이 남아 있습니다.
 

A100 :

 void OnStart ()
{
         Print ( ( int )( 3.0001 + 0.999999999999999 )); //все равно 4
         Print ( floor ( 3.00001 ));                     //3
}




이해하지 못했습니다. 잼이 뭔가요?

 
A100 :
모든 숫자 x에 대해 모든 것이 잘 될 것인지 확인하는 것이 남아 있습니다.

당연히 안될꺼야...

결국 이런 일이 발생하면:

 double x= 3 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
if (x!= 3.4 ) Print ( "oppps..." ); // oppps...

그렇다면 질문은 저를 위한 것이 아니라 이 아이디어를 위한 것이 아닙니다.

 
Nikolai Semko :
잼이 뭔가요?
 void OnStart ()
{
         double d =   16 + 0.999999999999999 ;
         Print ( ( int )(d + 0.999999999999999 )); //18
         Print ( ( int ) ceil ( d ));               //17
}
 
A100 :

내 이전 게시물을 참조하십시오

 
Nikolai Semko :
그렇다면 질문은 저를 위한 것이 아니라 이 아이디어를 위한 것이 아닙니다.
floor(), ceil(), round()는 이를 위해 존재합니다. 따라서 질문이 없습니다.
 

위에 나열된 이러한 모든 결함은 양수 반올림 속도를 높이기 위해 이 솔루션을 실제로 사용하는 범위를 넘어선다고 생각합니다. 16자 수준에서 정확도가 필요한 사람은 거의 없습니다. 그리고 이러한 잼은 컴파일러 자체의 20개 문자 수준에서 다양한 종류의 오버플로에서 발생합니다.

 
A100 :
floor(), ceil(), round()는 이를 위해 존재합니다. 따라서 질문이 없습니다.

나는 당신이 그것들을 사용하는 것을 금지하지 않습니다. 건강에 사용하십시오. 내가 직접 사용하겠습니다. 그러나 속도가 중요한 알고리즘을 만드는 경우 이 방법의 모든 뉘앙스를 고려하여 이 반올림 옵션을 사용합니다. 나는 다른 프로그래머들도 그러한 대안의 존재에 대해 아는 것이 유용할 것이라고 생각합니다. 이 반올림 방법의 뉘앙스를 알기 위해서는 토론이 필요합니다. 많은 분들께 감사드립니다. 내가 잘못?

 
Nikolai Semko :

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

따라서 DBL_EPSILON은 소수점 이하 16자리입니다. 2.2204460492503131e-016

그리고 귀하의 경우 실제로 하나인 것으로 밝혀졌습니다. 왜냐하면. 차이는 1e-16에 불과하며 이는 엡실론보다 2배 작습니다.

 
Alexey Navoykov :

따라서 DBL_EPSILON은 소수점 이하 16자리입니다. 2.2204460492503131e-016

그리고 귀하의 경우 실제로 하나인 것으로 밝혀졌습니다. 왜냐하면. 차이는 1e-16에 불과하며 이는 엡실론보다 2배 작습니다.


예, 이해하지만 작동하지 않습니다. 99개 16개에서는 작동하지 않는 것으로 나타났습니다(이상한, 이전에는 작동하는 것 같았습니다). 15개의 9와만 작동합니다.

 double x= 3 ;
int Y=( int ) ceil (x);
Print (Y);                         // 3
Y=( int )(x+ 0.999999999999999 ); 
Print (Y);                         // 3  (15 9-ток)
Y=( int )(x+ 0.9999999999999999 );
Print (Y);                         // 4  (16 9-ток)
Y=( int )(x+ 1 - DBL_EPSILON );
Print (Y);                         // 4