Language agnostic 在特定范围内有多少个不同的浮点数?

Language agnostic 在特定范围内有多少个不同的浮点数?,language-agnostic,ieee-754,Language Agnostic,Ieee 754,在0.0和0.5之间有多少个可表示的浮动?在0.5和1.0之间有多少个可表示的浮动?我对它背后的数学更感兴趣,我需要浮点数和双倍的答案,0.0..0.5:你需要担心指数从-1降到尽可能低,然后将你得到的时间乘以尾数中可以表示的不同值的数量 对于该范围内的每个值,如果将其加倍,则得到的值范围为0.5..1.0。加倍意味着增加指数 您还需要担心非标准化的数字,尾数不是用来表示1.x,而是0.x,因此都在较低的范围内,但不能通过增加指数来增加一倍(因为指数的某个特定值用于指示该值是非标准化的)。这本身

0.0
0.5
之间有多少个可表示的浮动?在
0.5
1.0
之间有多少个可表示的浮动?我对它背后的数学更感兴趣,我需要
浮点数
双倍
的答案,0.0..0.5:你需要担心指数从-1降到尽可能低,然后将你得到的时间乘以尾数中可以表示的不同值的数量


对于该范围内的每个值,如果将其加倍,则得到的值范围为0.5..1.0。加倍意味着增加指数


您还需要担心非标准化的数字,尾数不是用来表示1.x,而是0.x,因此都在较低的范围内,但不能通过增加指数来增加一倍(因为指数的某个特定值用于指示该值是非标准化的)。

这本身不是答案,但是你可能会从函数中得到一些相似之处。这样的东西应该能帮助你回答问题,尽管你必须自己算出数学:

float f = 0;
while(f < 0.5)
  {
    print("%f (repr: 0x%x)\n", f, *(unsigned *)&f);
    f = nextafterf(f, 0.5);
  }
float f=0;
而(f<0.5)
{
打印(“%f(repr:0x%x)\n”、f、*(未签名*)&f);
f=nextafterf(f,0.5);
}

对于IEEE754浮动,这相当简单。打开电视,继续读下去

2的所有纯幂都由尾数
0
表示,由于隐含的前导1,尾数实际上是
1.0
。通过偏差校正指数,因此1和0.5分别为1.0×20和1.0×2−1,或二进制:

S Ex+127尾数-1十六进制
1:0 011111000000000000000000000000x3F800000
+     0 + 127    1.0
0.5:0 01111110 000000000000000000000000x3F000000
+    -1 + 127    1.0
由于以这种形式表示的浮点数的顺序与其二进制表示的顺序相同,因此我们只需要取二进制表示的整数值的差,并得出以下结论:在区间[0.5,1.0]中存在0x800000=223,即8388608个单精度浮点数


同样,答案是252表示
双精度
,263表示
长双精度
IEEE754格式的浮点数介于0.0(含)和0.5(不含)之间当且仅当符号位为0且指数为
<-1
。尾数位可以是任意的。对于
浮点
,这使得
2^23
每个容许指数都是
double
2^52。有多少容许指数?对于
浮点
,归一化数字的最小指数是-126,对于ode>double是-1022,所以有

126*2^23 = 1056964608
float
值在
[0,0.5)

1022*2^52 = 4602678819172646912

double
值。

Kerrek给出了最好的解释:)

为了以防万一,这里也有一些代码可用于其他音程


提示:有多少位用于表示该分数范围?我不记得即时的证明,但您可以在或中找到答案。不要忘记计数-0.0:-)这将完全取决于您必须表示的位数。的可能重复。另请参阅“对于该范围内的每个值,如果将其加倍,则得到的值范围为0.5..1.0。”呃,不,您需要添加0.5,这意味着
ulp(0.5)
以下的所有数字都将变得相同(0.5),对于0.5..1范围,所有指数都是-1Oops——我在另一个方向考虑它(从0.5..1.0范围开始,将所有值减半,这将全部映射到较低的范围)是的,但它不会有所有的数字,特别是那些从未说过的数字,但是很好地描述了差距在哪里……而且在
0.0
0.5
之间有
0x3F000000
可表示的单精度浮动,超过10亿。很好!在你尝试这一半可表示的数字之前,我会n浮点数在-1和1之间,浮点数是20亿(或10亿在0和1之间),浮点数是这个数字的两倍,如果你开始计数,你将等待一个while@ratchetfreak-是的,但是如果你不知道基本的数学(像我一样)你最多可以从前二十个开始拼凑模式,然后你真正需要知道的就是开始点和结束点。但是,是的,如果你知道背后的数学知识就更好了。
#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