Какой тип числа с наибольшим числом чисел может содержать? - PullRequest
0 голосов
/ 14 февраля 2020

Я новичок в программировании и недавно задал этот простой вопрос. Тип с плавающей запятой имеет 32 бита, из которых 8 бит относятся к целой числовой части (цифры перед десятичной точкой). так что мой вопрос: могут ли числа с плавающей запятой содержать числа больше 255,9999?

, и я также был бы признателен, если бы кто-нибудь сказал мне, почему этот код ведет себя неожиданно. Это связанная проблема?

int main(){
float a=123456789.1;
printf("%lf",a);
return 0;
}

, для которого вывод:

123456792.000000

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Самый распространенный 32-битный формат с плавающей запятой, IEEE-754 binary32 , не имеет восьми битов для базы. База фиксируется на двух. Он имеет один бит для знака, восемь бит для поля экспоненты и 23 бита для поля значимости и части (дробная часть).

Бит знака определяет, является ли число положительным (0) или отрицательным (1 ).

Поле экспоненты e имеет несколько применений. Если это 11111111 (в двоичном виде), а поле значений и f равно нулю, значение с плавающей запятой представляет бесконечность. Если е равно 11111111, а поле значимое и ноль не равно нулю, оно представляет собой специальное «значение» Не-числа.

Если показатель степени не равен 11111111 и не равен нулю, значение с плавающей запятой представляет 2 e − 127 • (1 + f / 2 23 ), с добавленным знаком. Обратите внимание, что часть дроби формируется добавлением 1 к содержимому поля значимости. Это часто называют неявным 1, поэтому математическое значение и составляет 24 бита - 1 из первого значения 1, 23 из поля значения и значения.

Если показатель степени равен нулю, значение с плавающей запятой представляет 2 1 −127 • (0 + f / 2 23 ) с добавлением знака. Обратите внимание, что ведущий бит равен 0. Они называются субнормальными числами. Они включены в формат, чтобы заставить некоторые математические свойства работать в арифметике с плавающей точкой c.

. Таким образом, наибольшее конечное значение представляется, когда показатель равен 11111110 (254), а дробь равна единице (2 23 -1), поэтому представленное число равно 2 254−127 • (1+ (2 23 −1) / 2 23 ) = 2 127 • (1-2 −23 ) = 2 127 -2 104 = 340282346638528859811704183484516925440.

В float a=123456789.1; типу float не хватает точности для представления 123456789.1. (На самом деле, десятичная дробь .1 никогда не может быть представлена ​​в двоичном формате с плавающей запятой.) Когда у нас есть только 24 бита для значимого, самые близкие к 123456789.1 числа, которые мы можем представить, это 123456792 и 123456800.

1 голос
/ 14 февраля 2020

какое наибольшее число может удерживать тип []]?

Стандарт C определяет :

FLT_MAX

Включить <float.h>, чтобы оно было #define d.

0 голосов
/ 14 февраля 2020

<float.h> - число c ограничения типов с плавающей запятой содержит ваши ответы, в частности ...

  • FLT_MAX
  • DBL_MAX
  • LDBL_MAX

максимальное конечное значение float, double и long double соответственно

... и ...

  • FLT_DIG
  • DBL_DIG
  • LDBL_DIG

количество десятичных цифр, которые гарантированно сохраняются в тексте -> float / double / long double -> круговая передача текста без изменений из-за округления или переполнения

Эта последняя часть означает, что значение float длиннее (то есть более значимые цифры) чем FLT_DIG больше не гарантирует точную репрезентативность.

...