나는 double을 int로 변환하기 위해 장면 뒤에서 어떤 일이 발생하는지 궁금하다. int (5666.1)? 부모 클래스에 대한 자식 클래스의 static_cast보다 비용이 더 많이 듭니까? int와 double의 표현은 근본적으로 다르므로 프로세스 중에 생성 된 임시 객체가있을 것이고 값 비싼 것도있을 것입니다.장면 뒤의 int에서 double 변환?
답변
네이티브 부동 소수점이있는 모든 CPU에는 부동 소수점을 정수 데이터로 변환하는 명령이 있습니다. 그 작업은 몇 사이클에서 많은 시간이 걸릴 수 있습니다. 일반적으로 FP와 정수에 대해 별도의 CPU 레지스터가 있으므로 정수를 정수 레지스터로 이동해야만 사용할 수 있습니다. 아마도 다른 작업 일 수도 있고 비용이 많이들 수도 있습니다. 프로세서 설명서를 참조하십시오.
PowerPC는 특히 FP 레지스터의 정수를 정수 레지스터로 이동하라는 지시를 포함하지 않습니다. FP에서 메모리로의로드와 정수로의로드가 있어야합니다. 따라서 임시 변수가 만들어 졌다고 말할 수 있습니다.
하드웨어 FP 지원이없는 경우 번호를 해독해야합니다. IEEE FP 형식은 다음과 같습니다
sign | exponent + bias | mantissa
는
// Single-precision format values:
int const mantissa_bits = 23; // 52 for double.
int const exponent_bits = 8; // 11 for double.
int const exponent_bias = 127; // 1023 for double.
std::int32_t ieee;
std::memcpy(& ieee, & float_value, sizeof (std::int32_t));
std::int32_t mantissa = ieee & (1 << mantissa_bits)-1 | 1 << mantissa_bits;
int exponent = (ieee >> mantissa_bits & (1 << exponent_bits)-1)
- (exponent_bias + mantissa_bits);
if (exponent <= -32) {
mantissa = 0;
} else if (exponent < 0) {
mantissa >>= - exponent;
} else if (exponent + mantissa_bits + 1 >= 32) {
overflow();
} else {
mantissa <<= exponent;
}
if (ieee < 0) mantissa = - mantissa;
return mantissa;
즉, 몇 비트 풀고 지침과 변화처럼 뭔가를해야, 변환합니다.
코드 생성기가 인텔 SSE2 명령어 세트를 사용하는 경우에는 항상 작업을 완료하는 전용 FPU 명령어가 있습니다. cvttsd2si 그것은 빠르지 만 정적 인 캐스트만큼 빠르지는 않습니다. 보통 코드를 필요로하지 않습니다.
static_cast는 컴파일러의 C++ 코드 생성에 따라 다르지만 일반적으로 포인터 변경은 캐스트의 가정 된 정보를 기반으로 컴파일 타임에 계산되므로 런타임 비용이 없습니다.
double을 int로 변환하면 x86 시스템에서 컴파일러가 FIST (부동 소수점/정수 변환) 명령어를 생성하고 FPU가 변환을 수행합니다. 이 변환은 소프트웨어로 구현 될 수 있으며 특정 하드웨어에서이 방법으로 수행되거나 프로그램에서 필요합니다. GNU MPFR 라이브러리는 int에서 double 변환을 수행 할 수 있으며 모든 하드웨어에서 동일한 변환을 수행합니다.
- 1. int에서 바이트로의 암시적인 변환
- 2. .net 변환 bytearray double []
- 3. Android/Java가 할당없이 int에서 String으로 변환 중입니까?
- 4. 바이트 배열을 C에서 double 변환 #
- 5. double [] [] in을 float [] []로 변환
- 6. NSNumber (double) 값을 시간으로 변환
- 7. C에서 문자열로 분수로 double 변환 #
- 8. 3D 장면 내의 3D 장면
- 9. VB.NET에서 double 배열을 바이트 배열로 변환 하시겠습니까?
- 10. 표현식의 암시 적 유형 변환 double int
- 11. C#을 double to Pascal 리얼로 변환
- 12. 변환 목록 <double[]>이
- 13. matlab을 사용하여 12 비트로 변환 double
- 14. VB.Net Double double to
- 15. int에서 부호없는 int를
- 16. int에서 MethodInfo 검색
- 17. 어떻게 장면 2의 장면 내용을 모두 표시하지 않고 장면 1에서 장면 2로 단추를 탐색 할 수 있습니까?
- 18. double double 문제 jQuery delay()
- 19. Interlocked.CompareExchange (double, double, double)는 32 비트 OS에서 작동합니까?
- 20. 플래시 장면 길이를 늘리십시오.
- 21. cocos2d 장면 간 이동
- 22. 코로나에서 움직이는 장면
- 23. JavaFX의 다중 장면
- 24. 봄 - 장면 뒤에서 프록시하기
- 25. 플래시 장면 문제
- 26. QGraphics 장면 확대/축소
- 27. Corona sdk 장면 이동
- 28. 파이썬 장면 전환 감지
- 29. 올바른 cocos2d 장면 재시작?
- 30. 번들로 cocos2d 장면
현대의 x86의 경우 컴파일러에서 x87이 아닌 SSE2 명령어를 생성 할 수 있습니다. – MSalters
@MSalters : 의존; 일부 "현대"컴파일러는 여전히 기본적으로 x87 FPU에 codegen을 가지고 있지만, 많은 컴파일러가'cvttsd2si '를 방출합니다. –
예, x86-32에서는'cvttsd2si'가 있다고 가정 할 수 없습니다. 하지만 x86-64 용으로 비추천 x87 ins을 사용하는 컴파일러가 있습니까? – MSalters