温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c - Largest odd integer that can be represented as a float
bit c data-representation

c - 可以表示为浮点数的最大奇数整数

发布于 2020-05-11 09:32:39

我想知道最大的奇数整数可以准确地表示为浮点数吗?以及为什么在这种情况下表示为浮点数的最大偶数整数之间存在差异。

我相信这与基数2的指数2 ^ n-1有关,但是我对C语言中的数据表示不够熟悉,无法看到区别。

查看更多

提问者
RobWantsToLearn
被浏览
10
Eric Postpischil 2020-02-21 21:56

对于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其他。否则,没有奇数整数可表示。