#c #память #типы_данных #float
Читаю Ритчи и Кернигана. Си. Говорится, что float представляет собой 32-разрядный тип, но потом написано, что его диапазон 10-38 – 10+38. Почему именно так, если 232 - это вовсе не такое огромное число с 38 нулями. Чем обусловлен такой широкий диапазон при такой разрядности? И, будьте добры, подскажие литературу, которая поможет расставить точки над i относительно таких понятий, как "слово", объяснит, как устроена в машине память, как разрядность влияет на работу и т.д. У меня на примете только Танненбаум, Архитектура компьютера. Или это не сойдет?
Ответы
Ответ 1
Тебе нужно смотреть описание стандарта числа с плавающей запятой IEEE 754. только к целочисленным типам таким как byte применимы обычные преобразования двоичной системы счисления в другие, в числах с плавающей точкой всё несколько сложнее и каждый разряд числа несёт свой функционал, а разрядность по сути определяет размерность и точность более подробно тутОтвет 2
"Диапазоном значений" арифметического типа называется разность между максимальным и минимальным представимым в данном типе арифметическим значением. Эта разность никак не связана с количеством битов в представлении данного типа, а обуславливается лишь договоренностями о том, каким образом интерпретируются комбинации значащих битов, т.е. по каким правилам они отображаются на собственно арифметические значения. В качестве экстремального примера можно привести воображаемый экзотический тип, состоящий всего из одного бита. Договорившись, что нулевое значение этого бита кодирует значение 0, а единичное значение этого бита кодирует значение 1000000 мы получим тип с диапазоном значений в один миллион. При этом данный тип будет состоять всего из одного бита. Каким образом так получилось? Очень просто: мы просто пропустили все промежуточные значения между 0 и 1000000 - они в нашем воображаемом типе вообще не представимы. Совершенно аналогичная ситуация имеет место с плавающими типами, представленными в формате IEEE754, включая наш float. Эти типы допускают представление лишь некоторых частных арифметических значений, отстоящих друг от друга на определенное расстояние. И чем дальше мы удаляемся от нуля, тем больше становятся промежутки между представимыми значениями. Вот такими все увеличивающимися и увеличивающимися прыжками тип float в конечном итоге и допрыгал до значений ±1038 на обоих концах диапазона. При этом количество различных представимых значений в этом типе, разумеется, никак не может превысить 232Ответ 3
Грубо - из-за округлений. Пусть тот же int совершенно одинаково представляет числа в пределах сотни - т.е. для него что 123456, что 123448 - одно число. Тогда вы получите, что диапазон чисел, представимых этим int, вырастает в 100 раз. Если вы к float 1030 прибавите единицу - он этого не заметит... Вот вам простенькая программка - что реально нужно прибавить к этому 1030, чтоб float это заметил - убедитесь сами: int main(int argc, const char * argv[]) { float x = 1e30f; for(int i = 0; i < 30; ++i) { double delta = 1.0; for(int j = 0; j
Комментариев нет:
Отправить комментарий