0.0
和0.5
之间有多少可表示的浮点数? 0.5
和1.0
之间有多少可表示的浮点数?我对它背后的数学更感兴趣,我需要floats
和doubles
的答案。
答案 0 :(得分:14)
对于IEEE754浮点数,这是相当直接的。启动Online Float Calculator并继续阅读。
2的所有纯幂由尾数0
表示,由于隐含的前导1,实际为1.0
。指数通过偏差校正,因此1和0.5分别为1.0× 2 0 和1.0×2 -1 ,或二进制:
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
由于这种形式表示的浮点数的排序顺序与它们的二进制表示顺序相同,我们只需要取二进制表示的整数值的差值,得出结论:0x800000 = 2 23 ,即区间[0.5,1.0]中的8,388,608个单精度浮点值。
同样,double
的答案是2 52 ,long double
的答案是2 63 。
答案 1 :(得分:2)
当且仅当符号位为0且指数为< -1
时,IEEE754格式的浮点数介于0.0(含)和0.5(不包括)之间。尾数位可以是任意的。对于float
,对于2^23
2 ^ 52,每个可允许的指数为double
个数字。有多少可接受的指数?对于float
,标准化数字的最小指数为-126,double
为-1022,因此有
126*2^23 = 1056964608
float
和中的 [0, 0.5)
个值
1022*2^52 = 4602678819172646912
double
值。
答案 2 :(得分:1)
对于0.0..0.5:你需要担心从-1到尽可能低的指数,然后乘以你可以在尾数中表示的不同值的数量的时间。
对于该范围内的每个值,如果加倍,则得到0.5..1.0范围内的值。而加倍意味着只是提升指数。
您还需要担心非标准化数字,其中尾数不用于表示1.x,而是0.x,因此都将在您的较低范围内,但不能通过提高指数(因为指数的特定值用于表示该值是非标准化的)。
答案 3 :(得分:0)
这不是一个答案本身,但你可能会从nextafter
函数中获得一些改进。这样的事情应该可以帮助你回答你的问题,尽管你必须自己计算出数学:
float f = 0;
while(f < 0.5)
{
print("%f (repr: 0x%x)\n", f, *(unsigned *)&f);
f = nextafterf(f, 0.5);
}
答案 4 :(得分: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