developer tip

int와 floor로 캐스트

optionbox 2020. 8. 5. 08:10
반응형

int와 floor로 캐스트


이것들 사이에 차이점이 있습니까?

float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);

두 가지 경우 모두 동일한 결과를 얻습니다. 컴파일 된 코드에 차이가 있습니까?


int로 캐스팅하면 0쪽으로 잘립니다. floor()음의 무한대로 자릅니다. bar음수 이면 다른 값을 제공합니다 .


앞에서 말했듯이 양수의 경우 동일하지만 음수의 경우 다릅니다. 일반적으로 int는 0으로 반올림되고 floor는 음의 무한대로 반올림됩니다.

floor(4.5) = (int)4.5 = 4
floor(-4.5) = -5 
(int)(-4.5) = -4

이것은 실행 시간에도 차이가 있다고합니다. 시스템에서 캐스팅이 바닥보다 3 배 이상 빠르도록 시간을 정했습니다.

음수를 포함하여 제한된 범위의 값의 바닥 작업이 필요한 코드가 있습니다. 또한 매우 효율적이어야하므로 다음 기능을 사용합니다.

int int_floor(double x) 
{ 
    return (int)(x+100000) - 100000; 
}

물론 이것은 매우 큰 x 값 (일부 오버플로 문제가 발생할 수 있음)과 -100000 이하의 음수 값에 대해서는 실패합니다. 그러나 나는 바닥보다 최소 3 배 빠르도록 시계를,습니다. 우리의 응용 프로그램. 소금 한 덩어리로 가져와 시스템 등에서 테스트하십시오. 그러나 IMHO를 고려해 볼 가치가 있습니다.


SO 101, 사람들이 귀하의 질문에 대답 한 후에는 귀하의 질문을 바꾸지 말고 새로운 질문을 작성하십시오.

왜 같은 결과가 나올 것이라고 생각하십니까?

float foo = (int)(bar / 3.0) //will create an integer then assign it to a float

float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division

bar = 1.0

foo1 = 0;
foo2 = 0.33333...

편집 : 질문 사이에 혼란으로 인해 수정 된 수 있기 때문에 fabs()하고 floor().

원래 질문 예제 줄이 주어지면 :

1.  float foo = (int)(bar / 3.0);

2.  float foo = fabs(bar / 3.0);

차이점은 막대가 음수이면 결과는 첫 번째 음수이지만 두 번째 음수는 음수입니다. 첫 번째는 정수로 잘리고 두 번째는 소수 부분을 포함한 전체 10 진수 값을 반환합니다.


예. fabs인수의 절대 값을 반환하고 int로 캐스트하면 나누기가 잘 리므로 (가장 가까운 int로) 결과는 거의 항상 다릅니다.


두 가지 주요 차이점이 있습니다.

  1. 다른 사람들이 지적했듯이 정수로 캐스팅하면 0으로 자르고 floor()항상 음의 무한대로 자릅니다. 이것은 음의 피연산자에 대해 다른 동작입니다.

  2. 아무도는 (아직) 다른 차이를 지적 것 같다 - 당신의 인수가 큰 경우 또는 동등 이상 MAX_INT+1(또는 이하 -MAX_INT-1) 다음에 캐스팅 int최상위 비트가 발생합니다 (아마도 C) 또는 정의되지 않은 동작을 (낙하 C ++ 및 가능하면 C). EG int32 비트 인 경우 부호 비트에 31 비트의 데이터 만 있습니다. 따라서 double큰 크기로 이것을 사용하면 의도하지 않은 결과가 나옵니다.


(int) x정수 부분을 유지하라는 요청입니다 x(반올림은 없습니다)

fabs(x)= | x | 그래서 >= 0;

예 : (int) -3.5리턴 -3; fabs(-3.5)리턴 3.5;

일반적으로 fabs (x) >= x모든 x에 대해;

x >= (int) x 만약 x >= 0

x < (int) x 만약 x < 0

참고 URL : https://stackoverflow.com/questions/3300290/cast-to-int-vs-floor

반응형