有多少不同的数字是从1.5 x 10 ^( - 45)到3.4 x 10 ^ 38?

时间:2009-07-19 12:23:19

标签: floating-point numbers range precision

有多少个不同的数字是从1.5 x 10 -45 到3.4 x 10 38 (IEE754单精度浮点数)?

5 个答案:

答案 0 :(得分:23)

假设您正在谈论IEEE单精度浮点数的范围(1.5 x 10 ^ -45是 最小的正值,它可以代表它可以代表和3.4 x 10 ^ 38 最大的正值)

我们将为这个数字占用的4个字节设置以下可能的布局:

0 00000000 00000000000000000000000 = 0
0 00000000 00000000000000000000001 = 1.5 x 10^-45
......
0 11111110 11111111111111111111111 = 3.4 x 10^38
0 11111111 00000000000000000000000 = Infinity
0 11111111 xxxxxxxxxxxxxxxxxxxxxxx = NaNs

哪个应该在两者之间给我们2139095037个数字。

答案 1 :(得分:6)

当然,这可以通过programmaticaly完成,对于任何两个浮点数一般。 “词典索引”是浮点数的有序索引,可用于其他因素,因为IEEE 754的设计方式使其易于生成。

对于任何两个浮点数,基本规则是:(float1 > float2)然后(lexIndex1 > lexIndex2)

因此计算IEEE 754之间的数字是减去两个数字的词典索引的问题:

public class FloatUtil
{
    public static uint ToLexicographicIndex(float value)
    {
        //transfer bits to an int variable
        int signed32 = BitConverter.ToInt32(BitConverter.GetBytes(value), 0);
        uint unsigned32 = (uint)signed32;

        //(0x80000000 - unsigned32) returns 
        //appropriate index for negative numbers
        return (signed32 >= 0)
                   ? unsigned32
                   : 0x80000000 - unsigned32;
    }

    public static uint NumbersBetween(float value1, float value2)
    {
        if (float.IsNaN(value1) || float.IsInfinity(value1))
        {
            throw new ArgumentException("value1");
        }

        if (float.IsNaN(value2) || float.IsInfinity(value2))
        {
            throw new ArgumentException("value2");
        }

        uint li1 = ToLexicographicIndex(value1);
        uint li2 = ToLexicographicIndex(value2);

        //make sure return is positive
        return value1 >= value2 ? li1 - li2 : li2 - li1;
    }
}

当然,在这种情况下使用:

uint result = FloatUtil.NumbersBetween(1.5e-45f, 3.4e+38f);

在这种情况下,对于C#中的这些数字,结果为2139081117,因为3.4e+38f常量表达式不会编译为浮点范围的最大值。但是,使用float.MaxValue3.40282347E+38)作为第二个数字会为我们提供预期的数字2139095038

答案 2 :(得分:4)

我试图猜测你的问题究竟是什么。 1.4E-45大约是可以用IEEE 754单曲表示的最小数字(有时称为 epsilon )。最大的数字约为3.4E38。单个存储在32位值的计算机上,一个位用于符号。这留下31位来表示从 epsilon 到最大值的数字。如果我们假设所有可能的31位数字都产生有效单个,那么您的问题的答案是2 ^ 31或2,147,483,648。正如已经指出的那样,这个假设是不正确的,因为有些值是非数字 NaN

您可以在Wikipedia

上阅读有关浮点数的更多信息

答案 3 :(得分:0)

这不是真正的编程。

bc说(对于整数):

1.5*10^45
1500000000000000000000000000000000000000000000.0
3.4*10^38
340000000000000000000000000000000000000.0
1500000000000000000000000000000000000000000000.0-340000000000000000000000000000000000000.0
1499999660000000000000000000000000000000000000.0

答案 4 :(得分:0)

我认为你的意思是整数。你的意思是在3.4 * 10 ^ 38和1.5 * 10 ^ 45之间,因为1.5 * 10 ^ 45比另一个大。无论如何,答案与较小的数字相同。我假设您要排除这两个数字:

2到10之间有多少个数字?答案是10-2-1 = 7。实际上3,4,5,6,7,8,9是7个数字。所以“公式”是:

  

a和b之间有多少个数字?   答案是b-a-1

     

所以1.5 * 10 ^ 45-3.4 * 10 ^ 38 -1 =   15 * 10 ^ 44-34 * 10 ^ 37 -1 =   (15 * 10 ^ 7)* 10 ^ 37-34 * 10 ^ 37 -1   =(15 * 10 ^ 7-34)* 10 ^ 37 -1 =(150000000-34)* 10 ^ 37 -1 = 149999966   * 10 ^ 37 -1或149999965999999999999999999999999999999999999999