Rob*_*arn 2 c bit data-representation
我想知道可以完全表示为浮点数的最大奇数整数是多少?以及为什么在这种情况下表示为浮点数的最大偶数之间存在差异。
我相信这与基数 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。请注意,如果FLT_MANT_DIG == FLT_MAX_EXP,后一个表达式 withFLT_EPSILON应该使用,因为前者溢出。)
异常情况,只是为了完整性:
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其他。否则,没有奇数可表示。