0

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

4

5 回答 5

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 个数字。

于 2009-07-19T12:42:57.953 回答
6

当然,这可以通过编程方式完成,通常对于任何两个浮点数。“字典索引”是浮点数的有序索引,除其他外,因为 IEEE 754 的设计方式使其易于生成。

基本规则是,对于任意两个浮点数,如果(float1 > float2)then (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);

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

于 2009-07-20T16:22:57.093 回答
4

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

您可以在Wikipedia上阅读有关浮点数的更多信息

于 2009-07-19T12:43:23.507 回答
0

这不是真正的编程。

bc 说(对于整数):

1.5*10^45
1500000000000000000000000000000000000000000000.0
3.4*10^38
340000000000000000000000000000000000000.0
1500000000000000000000000000000000000000000000.0-340000000000000000000000000000000000000.0
1499999660000000000000000000000000000000000000.0
于 2009-07-19T12:32:38.760 回答
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之间有多少个数?答案是ba-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 或 1499999659999999999999999999999999999999999999

于 2009-07-19T12:35:35.143 回答