명확하게하기 위해 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 비트 플로트에 대해이 작업을 수행했지만 정상적으로 보였습니다.
답변
가수 비트 2 개 + 1 + 1
지수 (mantissa bits + 1)의 +1은 가수가 abcdef...
나타내는 숫자가 실제로 1.abcdef... × 2^e
이므로 여분의 암시 적 정밀도를 제공하기 때문입니다.
따라서 정확하게 표현할 수없고 반올림되는 첫 번째 정수 는
For float
, 16,777,217 (2 24 + 1)입니다.
의 경우 double
9,007,199,254,740,993 (2 53 + 1)입니다.
>>> 9007199254740993.0
9007199254740992
답변
n 비트 정수로 나타낼 수있는 가장 큰 값 은 2 n -1입니다. 위에서 언급했듯이, a float
는 24 비트의 정밀도를 가지며 이는 24 가 맞지 않을 것임을 암시하는 것처럼 보입니다 .
그러나 .
지수 범위 내에서 2의 거듭 제곱은 1.0 × 2 n 으로 정확하게 표현할 수 있으므로 2 24 는 적합하고 결과적으로 표현할 수 없는 첫 번째 정수 float
는 2 24 +1입니다. 위에서 언급했듯이. 다시.