2017-11-13 23 views
-1

IEEE-754 with single precisionに浮動小数点で表現できる浮動小数点数(整数でない整数)の計算方法を教えていただけますか?IEEE-754では浮動小数点で何倍の整数を単精度で表現できますか?

+1

整数の数はどういう意味ですか? –

+1

いくつの仮数ビットと指数ビットがありますか?それは価値の数の点で何を意味しますか?どの指数が小数値に変換されるかはどのように決定するのですか? –

+0

[IEEE-754のWikipediaのページ](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)から:*有効小数点以下6桁のすべての整数はIEEE 754浮動小数点数に変換することができます。精度を損なうことなくポイント値を返し、nが-126から127までの整数であるような2^nと書くことができる任意の数は、精度を損なうことなくIEEE 754浮動小数点数に変換できます。 –

答えて

2

単精度でIEEE-754の浮動小数点で表現できる整数の数はいくつですか?

これを判断する方法はさまざまです。単精度またはbinary32

IEEE-754は、全ての整数を符号化することができる2 に値0 - 符号化精度の24ビット(明示的に符号化された23 + 1は暗黙)を有しています。だから、ネガ(とない-0)、

(- 2^24 ... 2^24) is 0x2000000 - 1 different integer values 

ですべての有限FPは2 と高い値も整数または "整数" です。 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 の数を持っています。

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の合計又は整数値またはすべての可能なbinary32ビットパターンの約41%。

-0が+0とは異なるとみなされる場合はもう1つ。

最大有限バイナリ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; 
} 

を、後分未満、プログラムが出してくれる:

count = 1778384896 

あなたが治療に-0 +0と冗長として、1を減算したい場合。このコードは、Cコンパイラが提供する最大IEEE-754準拠でコンパイルすることをお勧めします。私はWindows上でIntelコンパイラのバージョン13を使用し、/fp:strictを指定しました。

+1

binary32の良いアプローチです。バイナリ64で[ちょっと長い](https://en.wikipedia.org/wiki/Terasecond_and_longer)のほんの一部を取るかもしれません。 ;-) – chux

+0

@chux疑いはありません。私は主に、浮動小数点に関連するほとんどの質問が最近の網羅的な検索によって答えられることを実証するために投稿しました(明らかな例外は2入力操作などです)。 – njuffa

関連する問題