2011-08-10 4 views
4

다음 코드는 C에서와 같이 작동하는 이유는 무엇입니까? 따라서IEEE 754 : 정확히 작동합니까?

2147483647 = 0  1001 1101  1111 1111 1111 1111 1111 111 

    (0.11111111111111111111111)base2 = (1-(0.5)^23)base10 
=> (1.11111111111111111111111)base2 = (1 + 1-(0.5)^23)base10 = (1.99999988)base10 

, 소수에 754 표기법 다시 IEEE 변환 : 1.99999988 * 2^30 = 2147483520

그래서 기술적으로 C 프로그램은 2,147,483,520을 인쇄해야합니다, 여기

float x = 2147483647; //2^31 
printf("%f\n", x); //Outputs 2147483648 

내 생각의 과정이다 ?

답변

3

이런 식으로 표현 될 수있는 다음의 두 값 2,147,483,520 및

후자는 표현할 수없는 "이상적인 하나"에 가까운 것처럼 2147483648이다 2147483647 될 것이라고 표시되는 값은,이를 사용 얻는다 :에 부동 소수점 값은 절사되지 않고 반올림됩니다.

1

The standard is available here. IEEE (및 그와 같은 다른 조직)는 표준을 판매하고, 조립 비용을 수용하고, 수락을 위해 로비하고, 표준의 품질을 개선함으로써 주로 돈을 벌기 때문에 구매해야 할 수도 있습니다.

비트는 사람 만이 그들에게 "나는 단어를 사용하는 경우,"

가 험 프티 덤프 티는 가 나는 그것이 의미하는 선택 단지 무엇을 의미 "오히려 경멸하는듯한 어조로 말했다로 지정하는 것을 의미 - 더 이상도 적지도 않다. " " 질문은"앨리스는 "당신이 단어를 많이 만들 수 있느냐에 따라 가지가 다른 것"이라고 말했습니다. "문제는"Humpty Dumpty는 말했다. "이것은 입니다. - 그게 전부입니다." (Looking Glass를 통해, 6 장 참조)

이 경우 IEEE는 비트의 의미를 결정했으며 printf 플래그 % f는 해당하는 사람의 표현을 인쇄하는 이유는 같은 표준.

간혹 비트를 다른 데이터 유형 (예 : int)으로 변환하고 해당 비트의 "기타"표현을 인쇄 할 수 있습니다. C는 많은 수의 일반 프로모션을 잡아낼 수 있지만 일반적으로 잘못된 유형의 포인터를 올바른 주소에 할당하는 데 도움을주고 혼란스럽게 할 수 있습니다 (역 참조).

수작업으로 작업하는 동안 실제 하드웨어는 정확하게 수학을 수행하지 않을 수 있습니다. 정수 수학에서는 표현의 정확성이 훨씬 더 높지만 부동 소수점 연산을 사용하면 숫자를 반올림하여 출력에 큰 차이가납니다. 심지어 때로는 시스템에 구워진 부동 소수점 오류를 언급하지도 않습니다 (고맙게도 자주는 아니지만).

1

부동 소수점 형식은 흔히 가수의 최상위 비트가 항상 1 인 "정규화 된 형식"으로되어 있습니다. 항상 1이기 때문에이를 저장하는 데 약간을 사용할 필요가 없습니다. 따라서 이러한 숫자 표현을 디코딩 할 때는 맨 위에 1을 다시 추가해야합니다.

1
2147483647 = 2^31 - 1 = +1 * 2^30 * 1.1111 1111 1111 1111 1111 1111 1111 11 

이 숫자를 IEEE 754-1985 단 정밀도 형식으로 인코딩 할 때 유효 숫자는 올바르게 반올림됩니다. 반올림 모드 을 반올림하여 (기본 반올림 모드)까지 반올림 한 경우 반올림됩니다.반올림하기 전에

:

exponent = 30, significand = 1.1111 1111 1111 1111 1111 1111 1111 11 

소수점 23 자리 유효 숫자 찰나 :

exponent = 30, significand = 10.0000 0000 0000 0000 0000 000 

정상화 후 : 단일 정밀도 형식으로 인코딩 된

exponent = 31, significand = 1.0 

:

1 | 10011110 | 00000000000000000000000 
관련 문제