2004-gre-cs-practice-book.pdf/Q22 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
 
(не показано 15 промежуточных версий 1 участника)
Строка 1: Строка 1:
{{reserve-task|[[Участник:Urmat A|Urmat A]] 12:39, 20 декабря 2024 (UTC)}}
 
 
== Вопрос: Q22-4c9f66 ==
 
== Вопрос: Q22-4c9f66 ==
  
Строка 27: Строка 26:
 
S = b_[:1]
 
S = b_[:1]
 
E = b_[1:9]
 
E = b_[1:9]
F = b_[9:] #было [10:], что пропускало единицу
+
F = b_[9:] #было [10:], что пропускало единицу, теперь F = 11000000000000000000000
 
S, E, F
 
S, E, F
 
</code-python>
 
</code-python>
Строка 35: Строка 34:
 
Видно, что-то отрицательное,  
 
Видно, что-то отрицательное,  
  
 +
Показатель 4
 
<code-python>
 
<code-python>
 
  print(0b10000011-127)
 
  print(0b10000011-127)
 
Показатель 4.
 
 
</code-python>
 
</code-python>
 +
 +
 +
Считаем F:
  
 
<code-python>
 
<code-python>
int_value = int("0xC1E00000", 16)
+
F_value = 0.0
fraction_bits = int_value & 0x7FFFFF
+
fraction_value = 0.0
+
 
for i in range(23):
 
for i in range(23):
     if (fraction_bits >> (22 - i)) & 0x01: # Проверяем i-й бит
+
     if (F[i] == '1'):
         fraction_value += 1 / (2 ** (i + 1))
+
         F_value += 1 / (2 ** (i + 1))
print (fraction_value)
+
print (F_value)
 
 
 
  0.75
 
  0.75
#Вот так правильно, потому что считается дробная часть.
 
 
</code-python>  
 
</code-python>  
  
<code-python>
+
Не забыть прибавить 1, потому что мантисса считается как M = 1.F = 1 + F. Поэтому M = 1.75
#А вот снизу то что было.
+
print(0b1000000000000000000000)
+
+
2097152
+
</code-python>
+
 
+
Не забыть прибавить 1, потому что нормализованная мантисса считается как M = 1 + F. Поэтому M = 1.75
+
 
+
1.2097152**4 = 2.1415713601250426
+
 
+
Надо разобраться, где-то накосячил.
+
 
+
  
 +
В итоге по формуле <m>N = (-1)^1 * 1.75 * 2^4 = -1.75 * 16 = -28</m>
  
 
{{cstest-source|2004-gre-cs-practice-book.pdf|21|22}}
 
{{cstest-source|2004-gre-cs-practice-book.pdf|21|22}}
  
{{question-ok|[[Участник:StasFomin|StasFomin]] 07:19, 14 декабря 2024 (UTC)}}
+
[[Категория:Машинная арифметика]]
 
+
[[Категория:Float]]
+
[[Категория:Разобраться]]
+

Текущая версия на 09:29, 21 декабря 2024

Вопрос: Q22-4c9f66

Согласно стандарту IEEE, 32-разрядное число с плавающей запятой одинарной точности N определяется как

где S — знаковый бит, F — дробная мантисса, а E — смещенный показатель степени

Число с плавающей запятой хранится в формате S : E : F, где S, E и F хранятся в 1 бите, 8 битах и 23 битах соответственно.

Каково десятичное значение числа с плавающей запятой C1E00000 (шестнадцатеричная система счисления)?

Ответы

  • 26
  • −15
  • −26
  • Правильный ответ: −28
  • −59

Объяснение

Ну, считаем поля на глаз:

b_ = bin(0xC1E00000)[2:]
S = b_[:1]
E = b_[1:9]
F = b_[9:] #было [10:], что пропускало единицу, теперь F = 11000000000000000000000
S, E, F
('1', '10000011', '11000000000000000000000')

Видно, что-то отрицательное,

Показатель 4

 print(0b10000011-127)


Считаем F:

F_value = 0.0
for i in range(23):
    if (F[i] == '1'):
        F_value += 1 / (2 ** (i + 1))
print (F_value)0.75

Не забыть прибавить 1, потому что мантисса считается как M = 1.F = 1 + F. Поэтому M = 1.75

В итоге по формуле

Исходники — вопрос 22 на 21 странице книги «2004-gre-cs-practice-book.pdf»