1>
int=(1/4) * (2*2) 결과0
int=(1/4) * (2**2) 결과1
** 의 의미가 뭔가요?
2>
int=1000000000 / 300000000 *3
int=10000000000 / 3000000000 *3
결과값: 위 9. 아래 10.
위 아래가 다른 이유가 무엇인가요?
책에 나왔는데 잘 이해가 되지 않습니다.
간단한 연산인 것 같은데 모르니 답답하네요.
도움 부탁드려요.
댓글 4
-
無念군
2008.12.05 00:03
-
bi
2008.12.05 01:21
아, 제곱이었군요.
제 아밥책이 영문이라 그런지 Power라고만 써있다는...
그리고 1>, 2>의 결과값이 왜 다른지 알고 싶은데,
무념군님도 저와 비슷한 추측을 하셨네요.ㅎ
아밥이 반올림하거나 안되는 건 버린다는 전제로는 정확한 추측은 불가능한 듯 합니다.
여러분, 알려주세요~~
-
초코
2008.12.05 22:16
아.. 일도 바쁜데 이게 무슨 짓인지..
이런거 파는게 재밌는거 보니 천상 개발자인가봅니다.
제가 유추해 본 내용인데 맞는거 같은지 함 봐주세요.
REPORT ZTEST_INT.
data: i1 type i,
i2 type i,
i3 type i.
* 다음 결과로 정수 계산식은 개별로 정수 연산하는 것을 알 수 있습니다.
* 또한 연산 중 소수점은 반올림합니다.
* 10/3=3(반올림) -> 3*3=9
* 10/6=2(반올림) -> 2*6=12
i1 = 10 / 3 * 3. "9
i2 = 10 / 6 * 6. "12
write: / i1, i2.
* 계산식 중 하나라도 실수라면 실수로 계산합니다.
i1 = '10.0' / 3 * 3. "10
i2 = '10.0' / 6 * 6. "10
write: / i1, i2.
* 앞에 설명처럼 정수형으로 계산한다면 9가 나와야 i2는 아니군요.
* 그런데 i2 에 쓰인 10000000000는 정수범위에서 벗어납니다.
* (정수(type i)범위: -2.147.483.648 to +2.147.483.647
* i2=10000000000. 하면 overflow 에러가 납니다만 연산에 사용되면 에러가 없군요.
i1 = 1000000000 / 300000000 * 3. "9
i2 = 10000000000 / 3000000000 * 3. "10
write: / i1, i2.
* 실수형으로 계산해보면 예상한 값이 나옵니다.
i1 = '1000000000.0' / 300000000 * 3. "10
i2 = '10000000000.0' / 3000000000 * 3. "10
write: / i1, i2.
* 다른 것도 볼까요.
* i2의 경우에는 마치 실수로 계산한 것처럼 나왔군요.
* i3의 경우에는 계산 중 정수범위를 벗어나니 overflow 에러가 납니다.
i1 = 1000000000 / 600000000 * 6. "12
i2 = 10000000000 / 6000000000 * 6. "10
*i3 = 1000000000 * 10 / 600000000 / 10 * 6. "overflow
write: / i1, i2.
**********************************************************************
* 결론: 계산 원칙!!
* 1. 정수로 이뤄진 계산식은 일일이 중간계산식을 반올림해가며 연산한다.
* 2. 실수가 한 개라도 포함된 계산식은 실수로 계산한다.
* 3. 정수계산 중 정수범위를 벗어나면 overflow 에러가 발생한다.
**********************************************************************
* 위의 내용을 알고 다음을 보면 쉽게 이해가 됩니다.
* 아래 결과들은 원칙에 맞습니다.
i1 = ( 1 / 4 ) * ( 2 * 2 ). "0
i2 = ( '1.0' / 4 ) * ( 2 * 2 ). "1
i3 = ( 1 / 4 ) * ( '2.0' * 2 ). "1
write:/ i1, i2, i3.
* i3이 실수로 계산되는 것 같은데요.
* 1/4는 확실히 정수계산식이니 의심되는 제곱을 i1에 넣어서
* 정수형으로 쐐기를 박았습니다.
* 그러게 계산하니 i2처럼 정수계산결과가 나오는군요.
i1 = 2 ** 2. "4
i2 = ( 1 / 4 ) * i1. "0
i3 = ( 1 / 4 ) * ( 2 ** 2 ). "1
write:/ i1, i2, i3.
**********************************************************************
* 결론: 제곱(**) 계산 결과는 실수형이다!!!
********************************************************************** -
bi
2008.12.06 00:54
초코님, 바쁘신 와중에도 명쾌한 설명 고맙습니다.
설명대로 생각해보니 고개가 끄덕여집니다.
이 유추가 맞는 것 아닐까요?
**은 .. "제곱"입니다
http://e-abap.servebbs.net/zb/bbs/zboard.php?id=ONEPAPER&no=151 <- 참조..
승제 후 가감... 동레벨은 좌-> 우 .. 가 기본 원칙입니다만..
위에 산식을 볼때 동일해야 할것으로 생각 됩니다만..
1>
int = ( 1 / 4 ) * ( 2 * 2 ) 결과0 -> (1/4) = 부분이 0 으로 인식
int = ( 1 / 4 ) * ( ( 2 ** 2 ) ) 결과1 -> (1/4) = 부분이 0.25 로 인식.. (**) 제곱 산식때문인지??
2>
int = 1000000000 / 300000000 * 3 -> 역시나 3.33333333333333.... * 3 = 9.99999999999...... 입니다 .. 소수점 이하를 버림..
int = 10000000000 / 3000000000 * 3 -> 역시나 3.33333333333333.... * 3 = 9.99999999999...... 입니다 .. 소수점 이하를 반올림...
자릿수 때문인지???
정확한 이유는 잘 모르겠습니다.. 예상되는 이유는 있지만.. -_-;; 내공이 부족한 걸까요??
이해 되시는분 ??~~ 답변 부탁 드려요..