2010-07-26 3 views
6

이 내가 Boost.NumericConversion을 시도했지만 같은 결과를 얻었다 9223372036854775808.안전 변환 내 플랫폼에

double x = 1e19; 
std::cout << static_cast<unsigned __int64>(x) << '\n'; 

인쇄합니다.

x을 2 등분으로 나눈 다음, 변환 된 반을 함께 더하면 정확한 결과를 얻을 수 있습니다. 하지만 템플릿 코드에서 사용할 일반 솔루션이 필요합니다.

미리 감사드립니다.

편집 : 이 문제는 Visual Studio 2008에서는 나타나지만 MinGW에서는 나타나지 않습니다. unsigned long으로 4.0e9를 캐스팅하면 정상적으로 작동합니다.

답변

10

gcc와 잘 작동하지만 Visual Studio에서는 문제가있는 것 같습니다. 이 문제에 대한 Microsoft's answer를 참조하십시오

우리의 부동 소수점 변환은 항상 부호있는 정수 완료 정수로. 이 특별한 경우 경우에 우리는이 설명하는대로 800.00을 생성하는 FIST 명령을 사용합니다. 따라서 부호없는 으로 변환하기위한 동작이 정의되어 있지 않습니다. 인 최대 64 비트 부호가있는 정수보다 큰 64 비트 정수 값입니다.

그래서 당신은 서명 된 64 비트 정수 범위에서 숫자를 변환 할 수 있습니다 -9,223,372,036854775808 +9,223,372,036854775807에 (-2^63 ~ 2^63-1).

1

컴파일러의 동작이 C99을 따르지 않으므로 가능한 경우 양수 값을 항상 올바르게 변환해야합니다. 그것은 음의 값에 대해서만 벗어날 수 있습니다. 정수형의 값 실제 플로팅 타입의 값이 부호 형식으로 변환 할 때 가 수행 될 필요 부호 형식으로 변환 할 때

는 remaindering 동작 을 수행 하였다. 따라서 이동 가능한 실제 범위 부동 값은 (-1, Utype_MAX + 1)입니다.

템플릿 코드의 경우 값이 static_cast<double>(UINT64_MAX/2)보다 큰지 테스트하고 이미 수행 한 복구 작업을 수행 할 수 있습니다. 이것이 상수 테스트에만 관련된 것이라면, 관련이없는 곳에서 최적화되어야합니다.