2012-01-16 1 views
13

0.00.5の間に浮動小数点数がいくつありますか? 0.51.0の間に浮動小数点数がいくつありますか?私はそれの背後にある数学にもっと興味があり、答えはfloatsdoublesです。特定の範囲にいくつの浮動小数点数がありますか?

+1

ヒントを再生するためのコードです念のために最良の説明:)

を与えましたその分数範囲を表すために使用されますか? –

+1

私は証明書を手元に置いていませんが、http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlまたはhttp:// floating-point-gui .de /。 – Crashworks

+0

-0.0を数えることを忘れないでください:-) – franji1

答えて

13

IEEE754が浮くため、これはかなり単純です。 Online Float Calculatorを起動して、読んでください。

2のすべて純粋な電力はそれほど1及び0.5は、それぞれ1.0   × であり、実際1.0による暗黙リーディング1指数をバイアスすることによって補正されることである仮数0、によって表され、 1.0   × 、またはバイナリで:

 S Ex + 127 Mantissa - 1    Hex 

1: 0 01111111 00000000000000000000000  0x3F800000 
     +  0 + 127 1.0 

0.5: 0 01111110 00000000000000000000000  0x3F000000 
     + -1 + 127 1.0 

この形式で表現浮動小数点数を同じオードに順序付けられているので2進表現の整数値の差を取って0x800000   = であると結論付けるだけです。つまり、区間[0.5,1.0 )。

同様に、答えは2 doubleためとです。

+3

... '0x3F000000'の表現可能な単精度浮動小数点数は、「0.0」と「0.5」の間に10億を超えています。ニース! – Arlen

1

0.0..0.5の場合:-1から指数をできるだけ低くすることを心配してから、仮数で表現できる別個の値の数を取得する回数を掛ける必要があります。

この範囲内のすべての値について、2倍にすると、0.5..1.0の範囲の値が得られます。それを倍増させるということは指数を上げることだけを意味します。

また、非正規化数については心配する必要があります。仮数は1.xではなく0.xを表すため、すべて下限になりますが、指数(指数の特定の値は、値が正規化されていないことを示すために使用されるため)。

+0

"その範囲内のすべての値について、それを2倍にすると、0.5..1.0の範囲の値が得られます。えええええええええええええええええええええええええええええええええええええええええええええええええん、0501.1の範囲では、ulp(0.5)の下のすべての数字がすべて同じ(0.5)になることを意味する* 0.5を追加する必要はありません。 –

+0

それは他の方向に向いています(0.5..1.0の範囲から、すべてのものを半分にする、どちらも低い範囲にマップされます)。 –

+0

ええ、それは特にそれらのすべての番号を持っていないだろう<0.25 –

0

これは回答ではありませんが、nextafter機能から多少の誤差が出る可能性があります。このような何かはあなたが数学を自分でうまくする必要がありますけれども、あなたは、あなたの質問に答えるべき:

float f = 0; 
while(f < 0.5) 
    { 
    print("%f (repr: 0x%x)\n", f, *(unsigned *)&f); 
    f = nextafterf(f, 0.5); 
    } 
+0

これを試してみる前に**浮動小数点の表現可能な数値の半分**は浮動小数点数の倍数の20億(または0と1の間は10億)の浮動小数点数で-1と1の間です* ifあなたはしばらく待っているとカウントを開始します –

+0

@ratchetfreak - 真ですが、あなたはおそらく最初の20からのパターンを一緒につなぎ始めることができます(そして私のような)基礎的な数学を知らない場合は、本当に知る必要があるのは始点と終点です。しかし、はい、それの背後にある数学を知っている方が良いです。 –

2

符号ビットが0で指数が< -1の場合に限り、IEEE754形式の浮動小数点数は0.0以上0.5以下です。仮数ビットは任意でよい。 floatの場合、double 2^52の場合、許容指数当たり2^23となります。許容できる指数はいくらですか?floatために、正規化数の最小指数はdoubleことが-1022だ、-126であるので[0, 0.5)

1022*2^52 = 4602678819172646912 

double値の

126*2^23 = 1056964608 
float

値が存在します。どのように多くのビット:

0

Kerrekはここでも他の間隔で
http://coliru.stacked-crooked.com/a/7a75ba5eceb49f84

#include <iostream> 
#include <cmath> 

template<typename T> 
unsigned long long int floatCount(T a, T b) 
{ 
    if (a > b) 
     return 0; 

    if (a == b) 
     return 1; 

    unsigned long long int count = 1; 

    while(a < b) { 
     a = std::nextafter(a, b); 
     ++count; 
    } 

    return count; 
} 

int main() 
{ 
    std::cout << "number of floats in [0.5..1.0] interval are " << floatCount(0.5f, 1.0f);  
} 

プリント

number of floats in [0.5..1.0] interval are 8388609 
関連する問題