Math IEEE754是否可以是实数;封面「;其范围内的所有整数?

Math IEEE754是否可以是实数;封面「;其范围内的所有整数?,math,Math,对原始问题进行了编辑(缩短),以关注精度问题,而不是范围问题 单精度或双精度,实数的每个表示形式都限制为(-range,+range)。在此范围内存在一些整数(1、2、3、4…等等;负数也是如此) 是否保证IEEE 754实数(浮点、双精度等)可以“覆盖”其范围内的所有整数?所谓“cover”,我的意思是实数将准确地表示整数,而不是(例如)“5.000001” 提醒一下:各种数字表示格式的解释很好 更新: 因为问题是关于“能”的,我也在寻找这样一个事实:这是不可能做到的——因为引用一个数字就足够

对原始问题进行了编辑(缩短),以关注精度问题,而不是范围问题

单精度或双精度,实数的每个表示形式都限制为(-range,+range)。在此范围内存在一些整数(1、2、3、4…等等;负数也是如此)

是否保证IEEE 754实数(浮点、双精度等)可以“覆盖”其范围内的所有整数?所谓“cover”,我的意思是实数将准确地表示整数,而不是(例如)“5.000001”

提醒一下:各种数字表示格式的解释很好

更新:

因为问题是关于“能”的,我也在寻找这样一个事实:这是不可能做到的——因为引用一个数字就足够了。例如,“不,这是不可能做到的,例如,数字1748574不是由浮点数精确表示的”(当然,这个数字是凭空得出的)

好奇的读者

如果您想玩IEEE 754表示法——在线计算器:

例如,在我的系统上,类型
float
最多可以表示大约
3.40282e+38
的值。作为一个整数,它大约是
340282000000000000000000000000
,或2128

float
的大小为32位,因此它最多可以准确表示232个不同的数字

整数对象通常使用其所有位来表示值(1位专用于有符号类型的符号位)。浮点对象使用它的一些位来表示指数(IEEE 32位浮点为8位);这会增加其射程,但会损失精度

一个具体的例子(
1267650600228229401496703205376.0
是2100,它可以精确地表示为一个
浮点值
):

从另一个角度来看:

32位对象最多可以表示232个不同的值

32位有符号整数可以表示
-2147483648
范围内的所有整数值<代码>2147483647(-231..+231-1)


32位浮点可以表示32位有符号整数无法表示的许多值,这可能是因为它们是分数(0.5)或太大(2.0100)。由于有些值可以用32位
浮点表示,但不能用32位
int
表示,因此必须有其他值可以用32位
int
表示,但不能用32位
浮点表示。这些值是具有比
float
所能处理的有效位数更多的整数,因为
int
有31个值位,而
float
只有大约24个值位。

显然,你在问一个实数据类型是否能代表其范围内的所有整数值(绝对值高达FLT_MAX或DBL_MAX,以C表示,或其他语言中的类似常量)

存储在K位中的浮点数表示的最大数通常比K位可以表示的2^K个整数大得多,因此通常答案是否定的。32位C浮点数超过10^37,32位C整数小于10^10。要找出某个数字后的下一个表示数,请使用或nextafterf()。例如

printf ("%20.4f %20.4f\n", nextafterf(1e5,1e9), nextafterf(1e6,1e9));
printf ("%20.4f %20.4f\n", nextafterf(1e7,1e9), nextafterf(1e8,1e9));
打印出来

     100000.0078         1000000.0625
   10000001.0000       100000008.0000
假设S-R<1和R 我没有填写所有的细节来说明J*p-U 每一个浮点数都是某个整数和某个2的幂的乘积或比率(如上两段所述),这一点在该条中也进行了讨论,在一段开头:

就其性质而言,所有以浮点格式表示的数字都是有理数,在相关的基中有终止展开(例如,…在基-2中有终止二进制展开)。无理数,如π或√2或非终止有理数必须近似。精度的位数(或位)也限制了可以精确表示的有理数集


不,不是全部,但存在一个范围,可以在该范围内准确表示所有整数

32位浮点数的结构 32位浮点类型使用

  • 标志1位
  • 指数为8位
  • 分数的23位(前导1)
表示数字

基本上,表格中有一个数字

(-)1.xxxx_xxxx_xxxx_xxxx_xxxx_xxx (binary)
然后用(无偏)指数左/右移动

要使它表示一个需要
n
位的整数,您需要将它向左移动
n-1
位。(浮点以外的所有
x
e都是零)

     100000.0078         1000000.0625
   10000001.0000       100000008.0000
(-)1.xxxx_xxxx_xxxx_xxxx_xxxx_xxx (binary)
1xxx_xxxx_xxxx_xxxx_xxxx_xxxx.0 (unbiased exponent = 23)
1111_1111_1111_1111_1111_1111.0
1_xxxx_xxxx_xxxx_xxxx_xxxx_xxx0.0