2015-01-24 6 views
5

두 개의 정수를 나눌 때 결과가 정수가 아닌 부동 소수점으로 표시되는 이유는 무엇입니까? 왜이 디자인 결정이 선택 되었습니까?왜 int/int = int인가?

+0

정수 나누기를 원하면 어떻게해야합니까? 그럼 내가 뭘해야하지? – Borgleader

+9

CPU 디자이너의 결정과 일치합니다. –

+5

솔직히 말해서 가장 의미가 있기 때문입니다. 'int'를 두 개 더하면'int'가 반환 될 것이라고 기대할 수 있습니까? 당연하지! 다른 모든 수학 연산과 동일하므로 왜 나누기에 예외가 생깁니 까? – CoryKramer

답변

9

초기 C가 설계 될 당시에는 많은 현대 하드웨어에 부동 소수점 지원이 없었습니다.

이전 버전 (BCPL 및 B)보다 C에 부동 소수점 유형이 추가 된 경우 나누기 연산자의 정수 의미가 변경되지 않았습니다.

BCPL manual

흥미로운 읽기 (강조 광산)에 대한 수 :

5.1 산술 식

문법적 형태 :

E1 * E2 또는 E1/E2 또는 E1 rem E2 또는 E1 + E2 또는 +E1 또는 E1 - E2 또는 -E1

의미 :이 연산자는 모두 피연산자의 Rvalues를 부호있는 정수로 해석하며 은 모두 정수 결과을 생성합니다.

...

오퍼레이터가 /E2로 나누어 E2E1 의해서도 E1의 분할 [정확한 결과를 산출 분할; 그렇지 않으면 구현에 따라 다르지만 반올림 오류는 결코 1보다 크지 않습니다.

rem 연산자의 나머지는 E1E2으로 나눈 값입니다. 그것의 정확한 명세는 구현에 의존한다.

이식성이 중요하지 않으며 언어는 기본 하드웨어가 무엇이든 할 수 있다는 것이 분명합니다.

오늘날에도 C를 지원하지만 부동 소수점 하드웨어가없는 플랫폼이 많습니다 (예 : 소형 임베디드 플랫폼).

일부 최신 상위 언어는 부동 소수점 나누기로 int/int을 정의하도록 선택합니다. 예를 들어, 파이썬 3은 정수 나누기를 위해 별도의 연산자 //을 가지고 있습니다. 흥미롭게도, 정수 나누기 연산자는 rounding rules that are different to its C counterpart입니다. [*]

C의 역사에 관심이 있으시면 Dennis Ritchie의 The Development of the C Language을보세요.

[*] 파이썬 정수는 arbitrary-precision이라는 점에서 흥미 롭습니다.