我想知道最大的奇数整数可以准确地表示为浮点数吗?以及为什么在这种情况下表示为浮点数的最大偶数整数之间存在差异。
我相信这与基数2的指数2 ^ n-1有关,但是我对C语言中的数据表示不够熟悉,无法看到区别。
对于IEEE-754基本的32位二进制浮点,最大可表示的奇数整数是2 24 -1。
对于IEEE-754基本64位二进制浮点,最大可表示的奇数整数是2 53 -1。
这是由于格式具有24位和53位有效位这一事实。(有效位数是浮点数的分数部分。)
有效位数中的位表示的值根据浮点数的指数进行缩放。为了表示奇数,浮点数的有效位数必须为2 0。对于24位有效数,如果最低位表示2 0,那么最高位表示2 23。当所有位都打开时,将获得最大值,这将使值2 0 + 2 1 + 2 2 +…2 23等于2 24 -1。
更一般地,最大可表示的奇数整数通常是scalbnf(1, FLT_MANT_DIG) - 1
。这也可以计算为(2 - FLT_EPSILON) / FLT_EPSILON
。(这是正常情况下的FLT_RADIX
偶数和偶数FLT_MANT_DIG <= FLT_MAX_EXP
。请注意,如果使用if FLT_MANT_DIG == FLT_MAX_EXP
,则后者FLT_EPSILON
应使用with ,因为前者会溢出。)
异常情况,仅出于完整性考虑:
FLT_RADIX
是奇数和FLT_MANT_DIG <= FLT_MAX_EXP
,最大可表示的奇数整数是FLT_MAX
如果FLT_MANT_DIG
是奇数和FLT_MAX - scalbnf(FLT_EPSILON, FLT_MAX_EXP+1)
否则。FLT_RADIX
为偶数FLT_MANT_DIG > FLT_MAX_EXP
,则:如果FLT_MAX_EXP > 0
,最大可表示的奇数整数为floorf(FLT_MAX)
。否则,没有奇数整数可表示。FLT_RADIX
为奇数和FLT_MANT_DIG > FLT_MAX_EXP
,则:如果为FLT_MAX_EXP > 0
,则最大可表示的奇数整数是floorf(FLT_MAX)
如果FLT_MANT_DIG - FLT_MAX_EXP
为奇数或floorf(FLT_MAX)-1
其他。否则,没有奇数整数可表示。
这对我来说很有意义,您如何计算它。因此,最大的偶数整数将是Chux在上面评论的float max?
然后,如果我要说的是最大的可表示奇数整数作为双精度数,我是否必须使用双精度数具有相似格式的有效位数?
因此,表示为双精度数的最大奇数整数将是2 ^(52)-1?而最大的甚至是2 ^ 1023?
@RobWantsToLearn:对于IEEE-754基本的64位二进制格式,最大可表示的奇数整数是2 ^ 53-1,而不是2 ^ 52-1。
@RobWantsToLearn:要调整以上内容
double
,请更改FLT
为函数名DBL
并将其f
后缀删除。