2013-10-11 2 views
0

long doublefloat으로 캐스팅하려고하는 기존 코드가 있습니다. long double는 플로트 플로트 변수가 캐스팅 후 참조 8.C++ Builder 2009 Float vs Long Double

, 당신은 예상 할 수있는 floating point overflow exception을 얻을 sizeof()의가 어디에 sizeof() (16)의이 같은 http://www.cplusplus.com/forum/beginner/34088/을 읽는에서 그것은 ...

보인다

디버그 모드에서 실행될 때 IDE는 모든 유형을 무시하지 않는 한 항상 예외를 표시합니다. 문제를 올바르게 해결하기를 원하므로이 작업을 원하지 않습니다. 이러한 캐스트를 할 수있는 방법이 (나 같은 정보를 얻을 것 주조 또는 대체) 오버 플로우를받지 않고, 거기에

:

그래서이 아래에 질문을 종기? floatVar = (float) longDoubleVar;

+0

캐스팅은 어떻게 이루어 집니까? – Oswald

+0

'floatVar = (float) longDoubleVar; ' –

답변

3

유형 float의 값 유형 long double의 값을 변환 잘 정의 및 의미 : 같은

현재 캐스팅 보인다. 결과가 너무 커서 float에 저장하지 못하면 결과는 부동 소수점 예외이며 기본적으로 아무 효과가 없습니다. 저장된 값은 +inf 또는 -inf입니다.

부동 소수점 예외는 C++ 예외가 아닙니다. 부동 소수점에만 국한되며 부동 소수점 트랩 처리기를 설치하지 않는 한 코드가 실행될 때 보이지 않습니다. 아마 IDE가 트랩 처리기를 설치합니다. 그렇다면 문서를 참조하여이 "기능"을 비활성화하는 방법을 찾아야합니다.

0

long double의 내용이 데이터를 자르지 않고 float 안에 들어갈 수 있다는 것을 알지 못하는 한 float는 결코 long double의 내용을 유지할 수 없습니다.

일반적으로 컴파일러는 가능한 데이터 손실을 경고하는 경고를 표시합니다. C++은 다양한 형식을 제공하지만 유감스럽게도 더 큰 데이터 유형에서 더 작은 데이터 유형으로 전환하면 항상 오버플로의 위험이 있습니다. 여기에있는 경우 긴 double 변수 내용은 float이 보유 할 수있는 것보다 큽니다.

오버 플로우가 발생하지 않는 유일한 방법은 더 작은 데이터 유형에서 더 큰 데이터 유형으로 이동하는 것입니다. 큰 것의 내용이 더 작은 유형의 경계에 맞을 경우 예외입니다 (어떤 경우에는 여전히 경고를 던질 것입니다).

+0

데이터를 절단해도 부동 소수점 예외가 발생하지 않습니다. –