컴파일러

컴파일러가 부동소수점 수의 덧셈 (a + b) + c를 엄격한 설정에서는 a + (b + c)로 마음대로 재배열하지 않는 이유로 올바른 것은 무엇인가?

  1. A반올림 오차 때문에 결합 법칙이 성립하지 않아 결과가 달라질 수 있기 때문
  2. B재배열하면 덧셈 횟수가 늘어나 버리기 때문
  3. C부동소수점 수의 덧셈은 하드웨어가 순서를 자동으로 정하기 때문
정답과 해설 보기

정답: A. 반올림 오차 때문에 결합 법칙이 성립하지 않아 결과가 달라질 수 있기 때문

부동소수점 수의 계산에서는 덧셈을 할 때마다 결과가 표현 가능한 자릿수로 반올림되므로 계산 순서를 바꾸면 결과가 미세하게 달라질 수 있습니다. 예를 들어 매우 큰 수와 작은 수를 먼저 더하면 작은 수가 반올림으로 사라지지만, 작은 수끼리 먼저 더하면 남는 경우가 있습니다. 그래서 엄격한 설정의 컴파일러는 순서를 유지합니다. 결과의 차이를 허용하는 설정(고속 수학 설정 등)을 선택하면 벡터화를 위해 재배열하기도 합니다. 덧셈 횟수는 달라지지 않습니다.

  • A. 올바릅니다. 반올림 때문에 결합 법칙이 성립하지 않아 결과가 달라질 수 있습니다.
  • B. 재배열해도 덧셈 횟수는 같습니다.
  • C. 계산 순서는 명령의 나열로 정해지며 하드웨어가 정하는 것이 아닙니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 컴파일러의 자동 벡터화에서 사용되는 명령의 종류로 올바른 것은 무엇인가?
  2. 컴파일러 최적화가 지켜야 하는 기본 조건으로 올바른 것은 무엇인가?
  3. 코드 생성 단계의 하나인 명령 선택(인스트럭션 셀렉션)에 대한 설명으로 올바른 것은 무엇인가?
  4. 크로스 컴파일러에 대한 설명으로 올바른 것은 무엇인가?
  5. 최적화를 적용해 컴파일한 프로그램을 디버거로 조사하면 일부 변수의 값이 "표시할 수 없음"으로 나오는 경우가 있다. 주된 이유는 무엇인가?

이 분야의 비교