본문 바로가기

Java

Infinity 의 함정 주의(Arithmetic Exception 으로 확인 불가 경우)

양수와 음수가 반복되는 배열에서

양수가 묶여있는 연속된 부분배열을 찾는 로직을 구상했다.

 

그런데 서버에서 배열을 받아오는 것 까지는 완료였고

아무리 코드를 봐도 정상작동해야했지만 뜻대로 작동하지 않았다.

 

결과값을 모두 프린트해보니

"Infinity" 라는 출력이 눈에 띄었고 잠시 후 눈치챘다.

rps 를 구하기 위해 [ 1 / (pulse width * 주기) ] 식이었는데

pulse width 에 0이 들어있는 경우가 있던 것이다.

(물론 이 0도 내가 임의적으로 넣었다.. 왜 그랬니)

 

여기서 궁금한 점은 두 개였다.

1. 왜 0으로 나눴는데 나누기를 zero 로 했다면서

Arithmetic Exception 이 뜨지 않았는가?

 

2. Infinity 는 정수와 비교연산자로 비교했을 때 더 크다고 평가되는 것이 맞는가?

 

인텔리제이로 실험해봤다.

코드설명

- 발견한 현상도 pw를 파이어스토어에서 받아오느라 long 타입이었따. 그대로 실험.

- rps 라는 double 타입 변수에 식을 똑같이 써봤다. 여기서 0.000016 은 Atmega128 MCU 의 주기 중 하나이다.

- 배열 세개 : 타입별로 다를 수도 있으니 0~9까지 타입변환하여 세 배열을 만들었다.

- rps 가 Infinity 라고 계산되었다면 정말 더 크다고 평가되는지 타입별로 출력해봤다.

- 마지막으로 그럼 상수 0을 분모로 넣으면 어김없이 예외가 나오는지 확인해봤다.

 

결과 :

자세한 건 연구끝나고 다시 찾아보겠지만

Infinity 라고 평가되었고,

30개 모두 true 라고 비교되었으며

 

0으로 나눴을 때는 예외가 발생하였다.

 

그래서 pw 는 어차피 0이 나올 수가 없는 구조라서 0빼고 계산하게 해놨고(임의로 넣은 0번째 index...다 제 업보)

해결되었다.

 

정리 안 해두면 나중에 또 헤맬 것 같아서 메모해둔다.