2011-09-02 2 views
4

이것은 실제 프로젝트에서는 문제가되지 않습니다. 나는 단지 호기심이 많다.다음으로 가장 가까운 값으로 double을 증가 시키시겠습니까?

증가 연산자 (i++)를 사용하여 int을 증가시킬 수 있습니다. 이 작업을 다음과 같이 정의 할 수 있습니다.
가장 가까운 값의 변수가 i으로 증가합니다. 이 경우 단순히 +1입니다.

하지만 IEEE 754-2008 시스템에 따라 특정 범위에서 사용할 수있는 double 값의 수를 정의하려고합니다. 일부 범위에서 이러한 양을 보여주고 감소하는 방식을 보여주는 그래프를 설정할 수 있습니다.

원래 두 배보다 큰 가장 가까운 값으로 double을 늘리는 비트 방식이 있어야합니다.

내가 Wikipedia에서 발견하는 것은 이것이다 :

더블 정밀 예 여기

0x 3ff0 0000 0000 0000 = 1 
0x 3ff0 0000 0000 0001 = 1.0000000000000002, the next higher number > 1 
0x 3ff0 0000 0000 0002 = 1.0000000000000004 

, 당신이 다음 높은 숫자가 바이너리 컨텐츠를 증가시켜 얻어지는 것을 알 수있다.

enter image description here

는 뭔가 다른 모든 분수 비트로 설정되어있는 작은 증가를 만들기 위해 수행해야한다고 생각 :하지만 이중 구조는 다음과 같습니다 있기 때문에이 작업을 계속할 것이라고 생각하지 않는다 하나.

아마도이 작업의 이름은 무엇입니까? 흥미로운 참조?
모든 정보는 환영합니다 : D

덕분에 C99에서

+0

이 질문은 진술 된 언어와는 전혀 관련이 없습니다. – Puppy

+1

알아,하지만이 방법은 사람들에게 다가 갈 수 있습니다. 개인적으로 항상 기본 태그를보고 있습니다. –

답변

4

하여 상당한를 분할해야 할 때, 당신이 볼 수있는 그 다음으로 높은 수 바이너리 내용을 증가시킴으로써 얻어진다. 하지만 이중 구조는 다음과 같습니다 있기 때문에이 작업을 계속할 것이라고 생각하지 않습니다

내가 모든 분수 비트가 설정된 경우에 다른 무언가가 가장 작은 증가를 만들기 위해 수행해야한다고 생각 [그림 생략] 하나에.

첫 번째 근사치로 예,이 입니다.

는 정규화 양수를 고려 이것은 예 1 < = m < 2 (이진수) 즉 미터 = 1.xxxxxxxm에게 * 2 이다. 이진 포인트 이전의 "1"은 저장된 값에서 생략되므로, 저장된 값의 "소수점"또는 "유효 숫자"부분은 이진 지점 뒤의 비트로 구성됩니다. 1111 (바이너리) 저장된 값 분수 부분 m = 1.1111 (이진)로 나타냄

이다보다 오히려 52 분수 부분에 단지 4 비트가 있다는 것을 생각 해보자. 이를 정수로 처리하고 증가 시키면 0000의 분수 부분에 캐리가 제공됩니다.

그러나 자릿수가 지수로 이동하여 증가합니다. 맞습니다. 1.1111 * 2 e 다음에 예상되는 다음 숫자는 실제로 1.0000 * 2 e + 1입니다.


나는 ..., 정수로 표현을 변환 증가, 더블로 다시 변환 "첫 번째 근사치에"긍정적 인 정규화 된 번호에 대해 잘 작동 하는가 말했다. 또한 양의 정규화 된 숫자 (최소 표준화 된 숫자보다 작으며, 지수가 0이고 일반적으로 숨겨진 비트가 명시 적 임)에도 적용됩니다.

정수 표현 또한 부호 크기 인 경우 음수로 작동합니다. 보통은 그렇지 않을 것이다. 더 일반적인 2의 보수를 위해서, 당신은 하나를 빼서 네거티브 더블을 "증가"시켜야합니다.

마지막으로 최대 정규화 수를 오버플로하고 지수를 무한대 및 NaN 범위로 증가시킵니다.

이 내용을 다루는 흥미로운 기사가 ​​있습니다. here.

2

nextafter(3)과 친구들이 있습니다.

수동으로 처리하려면 소수점을 나타내는 정수와 지수를 나타내는 정수가 가장 직선이라고 생각합니다.

당신이 subnormals를 피하고 긍정적 인 숫자를 증가하는 경우, 중요한에 도달 2 < < (52)는 지수를 높이고 여기에 2

관련 문제