정수 대 바닥으로 캐스트 / 3.0); 두 경우 모두 동일한 결과가 있음을

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

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 미만의 음수 값 등에 대해 실패 할 것입니다. 우리의 신청을 위해. 소금과 함께 가져 가서 시스템에서 테스트하는 등 IMHO를 고려할 가치가 있습니다.


답변

그래서 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);

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


답변

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


답변

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

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

  2. 아무도 (아직) 다른 차이점을 지적하지 않은 것 같습니다. 인수가보다 크거나 같으면 MAX_INT+1(또는보다 작 으면 -MAX_INT-1)로 캐스팅 int하면 최상위 비트가 삭제되거나 (C, 아마도) 정의되지 않은 동작 ( C ++ 및 가능하면 C). 예를 들어 int32 비트 인 경우 부호 비트와 31 비트의 데이터 만 있습니다. 따라서 double크기가 큰 a와 함께 사용하면 의도하지 않은 결과가 생성됩니다.


답변

(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