Float과 Int 간의 유형 조작: 안전한 접근 방식
서로 다른 데이터 유형 간에 작업을 수행하려고 할 때 적절한 유형을 고려하는 것이 중요합니다. 앨리어싱 충돌을 방지하는 방법입니다. 다음 코드 조각에서 유형 Punning에 관한 GCC C 컴파일러의 경고가 대표적인 예입니다.
float InverseSquareRoot(float x) { float xhalf = 0.5f*x; int32_t i = *(int32_t*)&x; i = 0x5f3759df - (i>>1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; }
이 문제를 해결하고 엄격한 앨리어싱 준수를 유지하려면 유형 캐스팅 대신 memcpy를 활용하는 것이 좋습니다. . 아래 수정된 코드는 이 방법을 구현합니다.
float xhalf = 0.5f*x; uint32_t i; assert(sizeof(x) == sizeof(i)); std::memcpy(&i, &x, sizeof(i)); i = 0x5f375a86 - (i>>1); std::memcpy(&x, &i, sizeof(i)); x = x*(1.5f - xhalf*x*x); return x;
이 방법에는 memcpy를 사용하여 float에서 int32_t로 바이트를 복사하는 작업이 포함됩니다. 결정적으로, float 개체는 int32_t 참조를 통해 직접 액세스되지 않으므로 앨리어싱 규칙을 준수합니다. 그러나 이 방법은 Assert 문에 표시된 대로 두 유형의 크기가 동일하다는 가정에 의존한다는 점에 유의하는 것이 중요합니다. 이 가정은 대부분의 시나리오에 적용되지만 특정 경우에는 확인이 필요합니다.
위 내용은 앨리어싱 문제를 피하기 위해 C에서 Float 및 Int 데이터 유형을 어떻게 안전하게 조작할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!