IEEE 754 float가 정확하게 표현할 수없는 첫 번째 정수는 어느 것입니까?


162

명확하게하기 위해 IEE 754 수레를 구현하는 언어를 사용하는 경우 다음을 선언합니다.

float f0 = 0.f;
float f1 = 1.f;

... 그런 다음 다시 인쇄하면 0.0000과 1.0000이 표시됩니다.

그러나 IEEE 754는 실제 라인을 따라 모든 숫자를 나타낼 수 없습니다. 0에 가까워지면 '갭'이 작습니다. 멀어 질수록 간격이 더 커집니다.

내 질문은 : IEEE 754 float의 경우 정확히 표현할 수없는 첫 번째 (0에 가장 가까운) 정수입니까? 지금은 32 비트 플로트에만 관심이 있지만 누군가가 64 비트에 대한 대답을 듣는 데 관심이 있습니다!

나는 이것이 bits_of_mantissa 를 계산 하고 1을 추가하는 것만 큼 간단하다고 생각했다 . 여기서 bits_of_mantissa 는 표준이 노출하는 비트 수이다. 내 컴퓨터 (MSVC ++, Win64)에서 32 비트 플로트에 대해이 작업을 수행했지만 정상적으로 보였습니다.


대표 할 수없는 숫자를 원한다면 왜 하나를 추가 했습니까? 그리고 몇 번이나 사용 했습니까? 그리고이 숙제입니까? 질문 제목에 "정수"라고 표시되어 있지만 질문에 "float"라고 표시되어 있습니다.
msw

5
가수를 최대화하면 가장 높은 숫자를 얻을 수 있다고 생각했기 때문입니다. 2 ^ 22. 아니요, 호기심 질문입니다. 문제의 정수가 항상 매우 작다는 것을 알았을 때도 항상 실수로 정수를 넣는 죄책감을 느꼈습니다. 상한이 무엇인지 알고 싶습니다. 내가 알 수있는 한 제목과 질문은 동일하며 다르게 표현됩니다.
Floomi



1
@KyleStrand가 되돌 렸습니다 ^ 2. 나는 왜 당시 어느 쪽이 다른 쪽보다 나에게 더 정확한지 모르겠습니다. 이제 둘 다에 비해 어색한 것 같다 "... 비트 수입니다 ..."
파스칼 Cuoq

답변:


211

가수 비트 2 개 + 1 + 1

지수 (mantissa bits + 1)의 +1은 가수가 abcdef...나타내는 숫자가 실제로 1.abcdef... × 2^e이므로 여분의 암시 적 정밀도를 제공하기 때문입니다.

따라서 정확하게 표현할 수없고 반올림되는 첫 번째 정수 는
For float, 16,777,217 (2 24 + 1)입니다.
의 경우 double9,007,199,254,740,993 (2 53 + 1)입니다.

>>> 9007199254740993.0
9007199254740992

나는 a를 선언하고 float16,777,217로 설정했습니다. 그러나 그것을 사용하여 인쇄하면 cout16,777,216이되었습니다. 을 사용하고 C++있습니다. 16,777,217을 얻을 수없는 이유는 무엇입니까?
나트륨 질산염

18
@sodiumnitrate 질문 제목을 확인하십시오. 16777217은 정확하게 표현할 수없는 첫 번째 정수 입니다.
kennytm

알았어 고마워. 혼란스러워서 미안합니다. 그래도 다른 질문이 있습니다 .16777216 이후에 표현 가능한 다음 정수가 2 * 16777216이 아니어야합니까? 비슷한 프로그램을 실행하면 16777126에 2를 추가하여 16777218을 얻습니다.
질산 나트륨

5
다음 정수는 실제로 16777218입니다. 2는 이제 마지막 유효 이진수가되기 때문입니다.
kennytm

6
C ++에서 그의 (1 << std::numeric_limits<float>::digits) + 1와 C에서, (1 << FLT_MANT_DIG) + 1. 전자는 템플릿의 일부가 될 수 있기 때문에 좋습니다. 가장 큰 표현 가능한 정수를 원할 경우 +1을 추가하지 마십시오.
Henry Schreiner

38

n 비트 정수로 나타낼 수있는 가장 큰 값 은 2 n -1입니다. 위에서 언급했듯이, a float는 24 비트의 정밀도를 가지며 이는 24 가 맞지 않을 것임을 암시하는 것처럼 보입니다 .

그러나 .

지수 범위 내에서 2의 거듭 제곱은 1.0 × 2 n 으로 정확하게 표현할 있으므로 2 24 적합하고 결과적으로 표현할 수 없는 첫 번째 정수 float는 2 24 +1입니다. 위에서 언급했듯이. 다시.


1
이것은 다른 쪽의 "추가 암시 적 정밀도"부분을 명확하게 설명했습니다. 감사.
chappjc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.