2017-11-13 14 views
-1

IEEE-754 with single precision에 부동 소수점으로 얼마나 많은 정수 (소수가 아닌 정수)를 계산할 수 있는지 이해할 수 있습니까?IEEE-754에서 부동 소수점으로 얼마나 많은 정수를 단 정밀도로 나타낼 수 있습니까?

+1

정수의 수는 무엇을 의미합니까? –

+1

얼마나 많은 가수 비트와 지수 비트가 있습니까? 그것은 가치의 수의 관점에서 무엇을 의미합니까? 그러한 지수 중 어느 값을 분수 값으로 변환 할 것인지 결정하는 방법은 무엇입니까? –

+0

[IEEE-754의 위키피디아 페이지] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format)에서 : * 유효 소수점 이하 6 자 이하의 모든 정수는 IEEE 754 부동 소수점 숫자로 변환 될 수 있습니다. 정확한 값을 잃지 않고 2 진수 값으로 변환 할 수 있으며, n이 -126에서 127 사이의 정수인 2^n과 같이 쓸 수있는 숫자는 정밀도를 잃지 않고 IEEE 754 부동 소수점 숫자로 변환 할 수 있습니다. * (놀라운 –

답변

2

단일 정밀도로 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? 가입일

이며 종종 binary32float하는 시퀀스 번호를 반환에는 그다지 휴대용 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이됩니다.

2

내가 게으른 오전, 그래서 다음과 같이 내가 (이것은 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을 지정했습니다.

+1

binary32에 대한 좋은 직접 접근 방식입니다. binary64로 [wee bit longer] (https://en.wikipedia.org/wiki/Terasecond_and_longer)의 일부분을 차지할 수도 있습니다. ;-) – chux

+0

@chux 의심의 여지가 없습니다. 저는 대부분 플로트와 관련된 대부분의 질문에 요즘 철저한 검색으로 대답 할 수 있음을 보여주기 위해 게시했습니다 (명백한 예외는 예를 들어 두 입력 작업 일 것입니다). – njuffa