Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Вещественные типы данных

#c


Дан вещественный тип данных, у которого максимальное значение 10^20, нужно узнать
сколько бит в нем отводится под экспоненту. Объясните, пожалуйста.
    


Ответы

Ответ 1



Вещественные числа с плавающей точкой, поддержанные на уровне процессора, описаны международным стандартом IEEE 754. Так основными двумя типами для любых вычислений являются single-precision (одинарной точности) и double-precision (двойной точности) floating-point (числа с плавающей точкой). Под представление с одинарной точностью выделено 32 бита, под двойную - 64 бита. В битах в числах одинарной точности: | 1 бит под знак | 8 бит экспоненты | 23 бита мантиссы | Для двойной точности: | 1 бит под знак | 11 бит экспоненты | 52 бита мантиссы | Попробуй так: #include typedef union { float f; struct { unsigned int mantisa : 23; unsigned int exponent : 8; unsigned int sign : 1; } parts; } float_cast; int main(void) { float_cast d1 = { .f = 0.15625 }; printf("sign = %x\n", d1.parts.sign); printf("exponent = %x\n", d1.parts.exponent); printf("mantisa = %x\n", d1.parts.mantisa); }

Ответ 2



Формально могут быть разные представления... Для определенности будем рассматривать нормализованную форму IEEE 745, когда мантисса принимает значения от 1 до 2, а порядок - со сдвигом в половину размера. Пусть под порядок отводится b бит; тогда максимальное значение порядка получается как 2b-1. Итого Дальше посмотрим - для 7 бит получается 64, максимальное число - 2*264 - примерно 3.6*1019. Немного не хватает. Значит, 8 бит - правда, при этом будет получаться уже 2*2128 ~ 6.8*1038. Поэтому у меня ощущение, что от вас ждут ответ 7 бит :) Однако стоит, например, изменить сдвиг в представлении порядка или представление мантиссы рассматривать не нормализованное - и сразу могут быть и другие варианты. "По-моему, так" (с) Пух

Ответ 3



Дан вещественный тип данных, нужно узнать сколько бит в нем отводится под экспоненту. Есть интересный способ: известно, что все используемые вещественные числа используют 1 бит под знак, имеют мантиссу и экспоненту. Мы легко можем узнать размер типа через sizeof, а с числом бит в мантиссе и экспоненте немного сложнее. Возьмём число 1 и будем делить его на 2 пока не получится 0. В какой момент он получится? Сначала число будет нормализованным и мантисса будет содержать 0, а экспонента будет уменьшаться. Затем экспонента достигнет минимального значения, число перейдёт в денормализованную форму и всю мантиссу проползёт одна единичка. Когда эта единичка скроется за пределами точности типа, число превратится в 0. Еще стоит заметить, что положительных экспонент на 1 больше, чем отрицательных, что даёт нам +1 бит и возможность безнаказанно считать положительные степени на 1 больше отрицательной. При попытке это использовать получим такой код: https://ideone.com/YuIWNc #include #define COUNT(type, result_m, result_e) do { \ type x = 1, exp; \ unsigned res, e; \ for (res=0; x!=0; ++res) x/=2.; \ for (exp=1,e=0; exp*2

Комментариев нет:

Отправить комментарий