IEEE-754 with single precision에 부동 소수점으로 얼마나 많은 정수 (소수가 아닌 정수)를 계산할 수 있는지 이해할 수 있습니까?IEEE-754에서 부동 소수점으로 얼마나 많은 정수를 단 정밀도로 나타낼 수 있습니까?
답변
단일 정밀도로 IEEE-754에서 부동 소수점으로 얼마나 많은 정수를 나타낼 수 있습니까?
이를 확인하는 방법에는 여러 가지가 있습니다.
단일 정밀도 IEEE-754 또는 binary32 모든 정수 0 24에 값 2 인코딩 할 수 - 부호화 정밀도의 24 비트가 (23 + 1 명백하게 인코딩 암시). 그래서
(- 2^24 ... 2^24) is 0x2000000 - 1 different integer values
, 네거티브 (그리고 -0)과 모든 유한 FP 2 24 이상도 정수 또는 "정수"입니다 값. function to retrieve the number of available distinct values within a range? 가입일
이며 종종 binary32 각 float
하는 시퀀스 번호를 반환에는 그다지 휴대용 C 코드는 다음 없다.
#include <stdint.h>
#include <string.h>
// Return a sequence number for each `float` value.
// Numerically sequential `float` values will have successive (+1) sequence numbers.
uint32_t float_sequence(float x) {
uint32_t u32;
memcpy(&u32, &x, sizeof u32);
if (u32 & 0x80000000) {
u32 ^= 0x80000000;
return 0x80000000 - u32;
}
return u32 + 0x80000000;
}
는 float_sequence(FLT_MAX) - float_sequence(1 << 24) + 1
, 우리는 유한 float
> = 2 24 수있다.
int main(void) {
int32_t imax = 1L << 24;
printf("%" PRIx32 "\n", float_sequence(FLT_MAX) - float_sequence((float)imax) + 1);
printf("%" PRIx32 "\n", (uint32_t) (imax - -imax) - 1);
printf("%" PRIx32 "\n", float_sequence((float) -imax) - float_sequence(-FLT_MAX) + 1);
return 0;
}
출력
34000000
1ffffff
34000000
그래서 0x69FFFFFF 전체 또는 1,778,384,895 정수 값 또는 모든 가능한 binary32 비트 패턴의 약 41 %.
-0이 +0과 다른 것으로 간주되는 경우 하나 더.
부호가있는 최대 유한 바이너리 32는 정수로 저장하려면 128 비트 정수가 필요합니다.
정수를 64 비트 2의 보수로 제한하면 설정 수는 0x29FFFFFE 또는 704,643,070이됩니다.
내가 게으른 오전, 그래서 다음과 같이 내가 (이것은 IEEE-754 binary32
부동 소수점 형식으로 float
지도 가정) 무차별 검색을 코딩 : 후, 합리적으로 빠른 PC에
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main (void)
{
volatile union {
float f;
uint32_t i;
} num;
uint32_t count = 0;
num.i = 0;
do {
if ((num.f == floorf (num.f)) && !isinf (num.f)) count++;
num.i++;
} while (num.i);
printf ("count = %u\n", count);
return EXIT_SUCCESS;
}
을 1 분 미만이면 프로그램이 튀어 나옵니다.
count = 1778384896
-0을 +0으로 중복하여 처리하려면 1을 빼십시오. 하나의 C 컴파일러가 제공하는 최대 IEEE-754 규격을 준수하여이 코드를 컴파일하는 것이 좋습니다. 필자는 Windows에서 인텔 컴파일러 버전 13을 사용하고 /fp:strict
을 지정했습니다.
정수의 수는 무엇을 의미합니까? –
얼마나 많은 가수 비트와 지수 비트가 있습니까? 그것은 가치의 수의 관점에서 무엇을 의미합니까? 그러한 지수 중 어느 값을 분수 값으로 변환 할 것인지 결정하는 방법은 무엇입니까? –
[IEEE-754의 위키피디아 페이지] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format)에서 : * 유효 소수점 이하 6 자 이하의 모든 정수는 IEEE 754 부동 소수점 숫자로 변환 될 수 있습니다. 정확한 값을 잃지 않고 2 진수 값으로 변환 할 수 있으며, n이 -126에서 127 사이의 정수인 2^n과 같이 쓸 수있는 숫자는 정밀도를 잃지 않고 IEEE 754 부동 소수점 숫자로 변환 할 수 있습니다. * (놀라운 –