2014-07-20 4 views
0

정수에 대한 캐스팅은 매우 간단하며 여분의 비트는 사라집니다.Java에서의 부동 소수점 캐스팅

하지만 부동 소수점 캐스팅의 후드에서 어떤 일이 일어나는지 이해하는 것이 중요합니까? 부동 소수점이 어떻게 계산되는지에 대한 정보를 읽으려고 시도했지만, 아직 그것을 잘 설명하는 정보를 찾지 못했습니다. 적어도 그건 내 변명이야. mantissa의 계산이 조금 어렵지만 기본적인 아이디어를 얻습니다.

적어도 자바 7까지, 비트 단위 연산에서는 부동 소수점을 사용할 수 없다는 것을 알고 있습니다. 내부적으로 어떻게 저장되어 있는지 이해하기 쉽습니다. 부동 소수점이 어떻게 작동하는지 또는 캐스팅되는지에 대해 알아야 할 중요한 것이 있습니까?

그래서, 요약 :

는 정수처럼 부동 소수점의 내부 동작을 이해하는 것이 중요하다?

부동 소수점을 정수로 캐스팅하는 내부 프로세스는 무엇입니까?

+0

일반적으로 : 예, 부동 소수점 값의 표현 방법을 이해하는 것이 중요합니다. 이것은 당신에게 꼭 필요한 독서입니다 : [모든 컴퓨터 과학자들이 부동 소수점 연산에 관해 알아야 할 내용] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

부동 소수점 숫자가 다양한 표현에서 내부적으로 어떻게 표현되는지에 대한 기초를 최소한 아십시오. 그렇지 않으면 잘못 처리하여 버그를 프로그램에 도입 할 수 있습니다. (0에 직접 비교, 비현실적인 높은 정확도 등을 기대하십시오) –

+0

이 블로그 게시물은 캐스트 구조를 사용하지 않고 부동 소수점 수를 정수로 변환하는 한 가지 방법을 보여줍니다. 의도가 가장 가까운 것으로 반올림하기 때문에 캐스트 구조를 피할 수 있지만, 하드웨어에 구현되는 것에 가깝게 만들거나 더 나은 기능이 이미 없으면 Java로 구현할 수 있습니다. http : // blog.frama-c.com/index.php?post/2013/05/03/nearbyintf2 –

답변

1

부동 소수점을 정수로 변환하는 내부 프로세스는 무엇입니까?

Java는 IEEE-754 표준을 준수하는 기계어 명령을 호출합니다. 자바가 그렇게 할 수있는 것은 아무것도 없다. 캐스팅이 어떻게 작동하는지 알고 싶으면 표준을 읽는 것이 좋습니다.

기본적으로 가수는 지수로 시프트되고 부호가 적용됩니다. 부동 소수점 숫자는 부호 * 2^지수 * 가수이며이 연산 및 누락 및 소수 부분을 수행하는 것입니다.

0

먼저 부동 소수점 숫자는 근사치임을 이해해야합니다. 1.23이 정확하게 표현되었으므로 1.23을 넣고 1.229998 (또는 그와 같은 것)을 꺼낼 수 있습니다. 캐스팅을 수행 할 것인지 여부에 관계없이이를 이해하고 계산 (특히 비교)에 어떤 영향을 미치는지 이해해야합니다. doublefloat가 포함 할 수있는 모든 값을 포함 할 수 있습니다 때문에, floatdouble A와 원인 정보의 손실을 주조 캐스트의 관점에서

. 그러나 double에서 float으로 캐스팅하면 32 비트보다 64 비트 값에 더 많은 정보가 있기 때문에 정밀도가 떨어질 수 있습니다 (매우 크거나 작은 숫자의 경우 지수 오버플로/언더 플로). 일부 데이터는 계속 이동하므로 결국 "바닥에". double 모든 int가 포함 할 수있는 값으로하고 일부를 포함 할 수 있기 때문에

마찬가지로 intdouble 수있는 정보의 손실에서 전송. 그러나 int에서 float 또는 long에서 double 또는 float으로 캐스팅하면 정밀도가 떨어질 수 있습니다 (지수 오버 플로우/언더 플로는 발생하지 않을 수 있음). float 또는 double 값이 큰 양의 지수 또는 음의 지수를 갖는 경우 int 또는 longfloat 또는 double 주조

쉽게 오버 플로우/언더 플로우 및 데이터의 큰 손실을 가져올 수있다. 그리고 물론 부동 소수점에서 고정 소수점 형변환으로 캐스팅 할 때 소수의 소수 부분이 잘립니다 (본질적으로 "바닥"연산).