int vs 플로어에 캐스팅
이들 사이에 어떤 차이가 있습니까?
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
두 건 모두 같은 결과가 나온 것으로 알고 있습니다.컴파일된 코드에 차이가 있나요?
int에 캐스팅하면 0 방향으로 잘라집니다. floor()
음의 무한대를 향해 잘라집니다.이렇게 하면 다음과 같은 다른 값을 얻을 수 있습니다.bar
음성이었다.
앞에서 말한 것처럼 양수는 같지만 음수는 다르다.규칙은 int는 0을 향해 반올림하는 반면 바닥은 음의 무한대를 향해 반올림하는 것입니다.
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를 고려해 볼 가치가 있습니다.
두 가지 주요 차이점이 있습니다.
다른 사람들이 지적했듯이, 정수로 캐스팅하면 0을 향해 잘라질 것입니다.
floor()
는 항상 음의 무한대를 향해 잘립니다.이것은 음의 피연산자에 대한 다른 동작입니다.아직 아무도 다른 차이점을 지적하지 않은 것 같습니다 - 당신의 주장이 더 크거나 같은 경우
MAX_INT+1
(또는 그 이하)-MAX_INT-1
)에 캐스팅합니다.int
그러면 최상위 비트가 드롭(C, 아마도)되거나 정의되지 않은 동작(C++ 및 C)이 발생합니다.EG의 경우int
는 32비트이며, 부호 비트와 31비트 데이터만 있습니다.이 기능을 사용하여double
의도하지 않은 결과를 초래할 수 있습니다.
그래서 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
는 인수의 절대값을 반환합니다.cast to int는 분할(가장 가까운 int까지)의 원인이 되므로 결과는 거의 항상 다릅니다.
(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
'programing' 카테고리의 다른 글
C: loop int 초기 선언용 (0) | 2022.08.10 |
---|---|
C/C++ 회선 번호 (0) | 2022.08.10 |
Vuex ReferenceError가 정의되지 않았습니다.값을 올바르게 설정하려면 어떻게 해야 합니까? (0) | 2022.08.10 |
size_t는 C로 얼마입니까? (0) | 2022.08.10 |
vuex 작업에 route.params.id 전달 (0) | 2022.08.10 |