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

Floating point 从1.5 x 10^(-45)到3.4 x 10^38有多少个不同的数字?,floating-point,numbers,range,precision,Floating Point,Numbers,Range,Precision,有多少不同的数字是从1.5 x 10-45到3.4 x 1038(IEE754单精度浮点)?这不是真正的编程 bc表示(对于整数): 我想你指的是整数。你的意思是在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.

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

这不是真正的编程

bc表示(对于整数):


我想你指的是整数。你的意思是在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或1499999659999999999999999999999999


假设您讨论的是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.4E-45近似为IEEE 754单体中可表示的最小数(有时称为ε)。最大数量约为3.4E38。一个符号在计算机上以32位值存储,一位用于符号。剩下31位表示从ε到最大值的数字。如果我们假设所有可能的31位数字都是有效的,那么您的问题的答案是2^31或2147483648。正如已经指出的,这种假设是不正确的,因为有些值不是数字或NaN


您可以在

上阅读更多关于浮点数的信息当然,这可以通过编程来完成,一般来说,对于任意两个浮点数。“词典索引”是浮点数的有序索引,因为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.MaxValue
3.40282347E+38
)作为第二个数字,我们得到了预期的数字,
2139095038

您所说的不同数字是什么意思?你的问题是关于计算机上数字的浮点表示法吗?另外,我假设你打算写3.4x10^38。在任意两个数字之间有无限多个不同的数字。你需要澄清你的问题。如果你指的是实数,那么无限就是答案。如果你说的是有理数或无理数。也是无限的。但如果你是指整数,那么看看我下面的答案。事实上,现在问题已经很好了:-)而且至少有一个不错的答案,我投票决定重新开放。有人接受吗?我认为至少有一个答案足以证明重新开放是合理的@帕克斯:谢谢你澄清这个问题。我不知道为什么这么多人在完全能够编辑一个问题的情况下会很快地结束这个问题。我猜点击“关闭”链接需要更少的思考和努力。编辑问题是为了纠正一个错误,然后引入另一个错误。范围的下限为1.5 x 10^-45,这不是整数。这可以从问题的标题中看出。在这种情况下,你的答案是正确的——它们之间有无限多个数字。但这仍然感觉像是一个家庭作业问题。为什么我们要再回答一次?你可能还应该排除一堆NaN。对,我忘记了第一个答案中的特例指数==255。谢谢关于“绝对…”-是的,这是一个笨拙的词语选择,这是一个错误的min(abs(x)):-)的翻译。此外,还有两个零和两个无穷大,以及低于正常值的数字。但是,从技术上讲,次正常值没有指定的界限,零也是如此。所以你只需要去掉正负无穷大和NaN's,D'oh。内在的,而不是外在的。我讨厌错误颠倒句子的意思。你的假设是错误的,不是每个32位的值都可以代表一个数字。你是对的,但由于这个问题看起来像一个简单的家庭作业问题,我试图给出一个简单的答案,不涉及对IEEE 754的详细理解,但简单地说,就是在计算机上使用浮点数来近似实数的概念。这就是问题的答案。当我第一次想添加它时,问题就解决了:)如果我们将代码中的逻辑应用于整数,4和2之间有(4-2)=两个数。由于这个错误,你的答案比正确答案大了一个。我明白你的意思。非包容区间集。然而,对于“有多少不同的数字是从2到4(int)”的答案,我仍然会回答2。好吧,让我们换一种说法——“有多少不同的早晨是从周五早上到周日早上”?
uint result = FloatUtil.NumbersBetween(1.5e-45f, 3.4e+38f);