Наибольшее нечетное целое число, которое может быть представлено как число с плавающей точкой - PullRequest
0 голосов
/ 11 сентября 2018

Мне было интересно, какое наибольшее нечетное целое число можно представить в точности как число с плавающей точкой?И почему в этом случае есть разница между наибольшим четным числом, представленным как число с плавающей точкой.

Я полагаю, что это будет иметь отношение к базовым показателям 2 2 ^ n-1, однако я недостаточно знаком с представлением данных в C, чтобы увидеть различие.

1 Ответ

0 голосов
/ 11 сентября 2018

Для базового 32-разрядного двоичного числа с плавающей точкой IEEE-754 наибольшее представимое нечетное целое число составляет 2 24 -1.

Для базового 64-разрядного двоичного числа с плавающей точкой IEEE-754 наибольшее представимое нечетное целое число равно 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, последнее выражение с FLT_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 в противном случае. В противном случае никакие нечетные целые числа представимы.
...