2014-09-14 3 views
1

나는 d == (double)(float)d을 읽었습니다. 여기서 d는 double으로 평가되지 않습니다.
우리는 정밀도가 낮은 유형으로 캐스팅하기 때문에 의미가 있습니다. 그러나 예제로 주어진 숫자는 이해할 수 없습니다.double에서 float으로의 캐스팅

1110101100011001010011111000111000011010111001010010010111111101010111011100111110101011000010000000000000000000000000000000000000000 

그리고 무한대가 지수로 표시되는 모두 1 및 분획 모두 0 :
그것은 인 D 인 경우 1e40식이 + 무한대
그러나 1e40의 비트 패턴을 평가하게했다.
캐스팅을 통해이 구체적인 예를 무한대로 어떻게 줄일 수 있습니까?

답변

3

최대 float (IEEE-754 binary32) 값은 약 3.4028234 × 1e38입니다. 따라서 double1e40float으로 변환하면 양의 무한대가됩니다.

+0

무한대를 나타내는 비트 패턴으로 끝나는 비트 패턴의 일부를 "잘라내는"문제가 아닌가? 정수와 마찬가지로 비트 패턴의 일부를 캐스팅 할 때 보존 됨 – Cratylus

+0

@Cratylus 부호있는 정수의 경우 ('signed char x = 256;'과 같이) 실제로 C로 구현에 정의되어 있습니다. 부동 소수점의 경우, 기본 반올림 지정을 사용하는 IEEE-754의 결과는 여기에서 양의 무한대입니다. – ouah

+1

이 답변은 "X가 최대 [유한] 부동 소수점 값보다 커서 따라서 X가 부동 소수점으로'+ inf'"가 적용되는 것처럼 들립니다. 이 논리는 '1e40'에서 작동하지만 잘못된 것입니다. float '+ inf'로 반올림 할 수있는 최소 숫자는 정확히 16 진수로 0x1.ffffffp127 또는 10 진수의 대략 3.4028235678E38입니다. –

2

float이 양수 및 음수 무한대를 지원하는지 여부에 따라 정의되지 않은 동작 일 수 있습니다. N1570은 §6.3.1.5 : 값이 정확하게 새로운 형태로 표현 될 수 변환되는 경우 실제 플로팅 타입의 값이, 실제 부동 형식으로 변환된다

그것은 불변이다. 변환 될 값이 표현할 수있는 값 범위의 범위에 있고 정확하게 으로 표시 될 수없는 경우 결과는 구현 정의 방식으로 선택된 가장 가까운 가장 높은 값 또는 가장 가까운 값 인값입니다. 변환 될 값이 일 수있는 값의 범위를 벗어나면 동작은 정의되지 않습니다.

§5.2.4.2.2/P5 :

플로팅 타입의 표현 가능한 값의 최소 범위가 가장 긍정적 통해 유형 에서 가장 네거티브 유한 부동 소수점 수이다 표현할 그 타입은 로 표현되는 유한 부동 소수점 숫자. 또한 음의 무한대가 유형으로 표현 될 수있는 경우 해당 유형의 범위가 모든 음의 실수로 확장됩니다. 마찬가지로, 양의 무한대가 한 형식에서 표현 가능한 경우 해당 형식의 범위는 모든 양의 실수로 확장됩니다. IEEE-754 부동 소수점을 사용하는 경우

다음은 1e40binary32 표현할의 유한 수의 범위 밖이며, 기본의 전환 수율 무한대 반올림 모드.당신이 float에 질문에 이진 순서를 변환하려고하면

+0

무한대를 나타내는 비트 패턴으로 끝나는 비트 패턴의 일부분을 "자르는"문제가 아닌가? 비트 패턴의 일부를 캐스팅 할 때 정수가 유지되는 것처럼 – Cratylus

+1

아무 것도 가치가 없다는 점은 주목할 가치가있다. * 주목할 가치가있는 * 것과 동일하지 않습니다. –

+2

@barakmanos * 가치가있는 * 가치가 * 주목할만한 가치로 변경되었습니다. –

2

, 바이너리를 작성 후 다음 단계는 그래서를 "정상화"하는 것입니다 :

 
1.11010110001100101001111100011100001101011100101001001011111110… * 2128 

그리고 24 유효 자릿수로 반올림 한 후 :

 
1.11010110001100101010000 * 2128 

숫자 128은 단 정밀도 IEEE 754 2 진 표현에 대한 지수의 허용 범위를 벗어납니다. 정규화 된 숫자의 지수는 -126에서 +127까지이며, denomalized 숫자 (0 포함), 무한대 및 NaN을 나타내는 데 사용되는 두 가지 예외 값이 있습니다. 숫자 1E38가 +inf, 특별한 지수 중 하나를 사용하여 인코딩 된 특수 값 중 하나와 같은 float로 표현 끝, 그리고 유효 숫자 1.110101100011이없는 이유

이것은 당신이 예상 한 수 ...입니다.

+0

+ 1.이 질문에 대한 대답은 어떻게 든 내 다른 질문을 "터치"하는 것처럼 보입니다. http://stackoverflow.com/questions/25831471/convert-between-formats-with-different-number 지수와 소수점을위한 비트 수 – Cratylus

+0

어떻게 2^128을 유도 했습니까? float의 분수 부분은 24 (23 + 1)이기 때문에 24 자리에서 반올림한다고 가정합니다. – Cratylus

+0

128은 정규화 할 때 점의 왼쪽에 입력 한 2 진수의 수입니다. 111 = 11.1 * 2^1 = 1.11 * 2^2와 같은 것. 128은 금지 된 지수입니다. 왜냐하면 정규화 된 binary32 숫자에 대한 허용 지수가 -126에서 127로 바뀌기 때문입니다. 즉, 128의 오프 한계는 8 비트의 지수 선택과 특수 값에 대해 두 지수를 예약해야 할 필요성 때문에 발생합니다. http://en.wikipedia.org/wiki/Single-precision_floating-point_format –

관련 문제