Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566

Frac in single precision

10.02.2023, 18:47. Показов 668. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Йоу, да это я собственной персоной DOPIXKMNLD
У меня было задание сделать перевод в "Фракция с одинарной точностью", ну тот, который IEEE-754
На входные данные в коде должны быть два числа, а код конвертирует 1-е число/ 2-е число, то есть дробь(Да, именно дробь!) в эту сингл пресижн
Так вот, мой код конвертирует номрально числа только если числитель дроби меньше ее знаменателя(то есть дробь меньше единицы)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def frac_to_single_precision(a, b):
    assert b != 0, "denominator cannot be 0"
    s = 0
    if a * b < 0:
        s = 1
    a, b = abs(a), abs(b)
    e = 0
    while True:
        a *= 2
        e -= 1
        if a >= b:
            a -= b
            break
    e_code = e + 127
    assert (0 <= e_code <= 255)
 
    bs = [0, 0, 0, 0]
 
    bs[0] = (s << 7) | (e_code >> 1)
 
    bs[1] = (e_code & 1) << 7
 
    for i in range(6, -1, -1):
 
        a *= 2
 
        bit = 0
 
        if a >= b:
            bit = 1
 
            a -= b
 
        bs[1] |= bit << i
 
    for k in range(2, 4):
 
        for j in range(7, -1, -1):
 
            a *= 2
 
            bit = 0
 
            if a >= b:
 
                bit = 1
                a -= b
            bs[
                k] |= bit << j
 
    return ' '.join([f'{value:02x}' for value in bs])
 
 
if name == 'main':
    print(frac_to_single_precision(1, 4))
Если что так и было задумано, учитель попросил сделать так(ЗЫ: алгоритм максимально громоздкий, но это алгоритм учителя)

Как мой код исправить так, чтобы он нормально переводил числа, даже если числитель больше знаменателя?
То есть мне надо сделать так:
Python
1
2
3
4
if a > b:
   # сюда алгоритм который я хочу понять как делать
if a <= b:
   # сюда уже мой алгоритм

ЗЫ: для самопроверки, вот сайт который хорошо все переводит: https://www.h-schmidt.net/Floa... EE754.html
В верхнюю строчку вводите число, которое хотите перевести, в нижней выскакивает ответ
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2023, 18:47
Ответы с готовыми решениями:

Каков диапазон порядка вещественных чисел согласно IEEE 754 Single Precision
Почему диапазон порядка от -127 до 128 (без смещения)? ведь дипазон чисел со знаком в доп. коде -128 до 127. В IEEE 754 пишут что...

Frac(89/12) = Frac(5/12) -> False Почему?
begin writeln(Frac(89/12) = Frac(5/12)); end. False Почему так?

argctg(x)=x-\frac{{x}^{3}}{3}+\frac{{x}^{5}}{5}-\frac{{x}^{7}}{7}+
Вычислить сумму ряда для заданного x. Вычисления заканчиваются, когда очередной член ряда по модулю становится меньше 0.001. Использовать...

5
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
11.02.2023, 01:55
Лучший ответ Сообщение было отмечено DOPIXKMNLD как решение

Решение

DOPIXKMNLD,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def frac_to_single_precision(a, b):
    assert b != 0, "denominator cannot be 0"
    s = 0
    
    ##############
    e = 0
    while abs(a) > abs(b):
        e += 1 
        if not a%2:
            a //= 2
        else:
            b *= 2
    #############
    if a * b < 0:
        s = 1
    a, b = abs(a), abs(b)
    #e = 0
    while True:
        a *= 2
        e -= 1
        if a >= b:
            a -= b
            break
    e_code = e + 127
    assert (0 <= e_code <= 255)
    bs = [0, 0, 0, 0]
    bs[0] = (s << 7) | (e_code >> 1)
    bs[1] = (e_code & 1) << 7
    for i in range(6, -1, -1):
        a *= 2
        bit = 0
        if a >= b:
            bit = 1
            a -= b
        bs[1] |= bit << i
    for k in range(2, 4):
        for j in range(7, -1, -1):
            a *= 2
            bit = 0
            if a >= b:
                bit = 1
                a -= b
            bs[k] |= bit << j
 
    return ' '.join([f'{value:02x}' for value in bs])
 
 
print(frac_to_single_precision(51, 11))
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
11.02.2023, 07:18  [ТС]
Gdez, Извините, а можете оьъяснить функцию, роль вашего добавленного кода?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
11.02.2023, 08:05
DOPIXKMNLD, Весь код построен на «переводе в двоичную СС». Если числитель больше знаменателя, то уменьшаем разрядность числа (делением на 2), увеличивая его экспоненту на 1.
Если изначально дробное число перевести в двоичную систему, например, 4.5, получим 100.1
«Добавка» выполняет -> 45/10 -> 45/20 -> 45/40 -> 45/80 (9/16) -> 0.1001 => три сдвига влево (экспонента повысилась на 3).
П.с. В свое время писал тоже самое, но через «сразу» перевод числа в двоичную СС с дальнейшей обработкой строк. Получилось чуть-чуть быстрее
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
11.02.2023, 08:10
Лучший ответ Сообщение было отмечено DOPIXKMNLD как решение

Решение

Python
1
2
3
4
from struct import pack
 
a, b = 51, 11
print(pack('!f', a / b).hex())
1
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
11.02.2023, 13:30  [ТС]
eaa, Код рабочий, только надо без использования модулей и ответ нужно вывести по 2 числа через пробел
Но мне уже помогли, ло не пожалел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2023, 13:30
Помогаю со студенческими работами здесь

Multiply produsers single consumer single linked list
Привет, нужно ревью разбирающихся людей. #include &lt;iostream&gt; #include &lt;atomic&gt; #include &lt;thread&gt; #include...

Формат single IBM float point преобразование в Csharp Single(float) формат
Возникла проблема с чтением данных в формате IBM float point. Пытался найти какой-либо простой метод преобразования во внутренний форма...

Frac
здравствуйте,использую функцию frac(X) но если x будет целое число то frac возвращает 1. как можно вытащить дробную щас целого числа))

trunc и frac в C++
С функцией trunc вроде разобралась, что в С++ она заменяется на floor.Правильно?? А frac на какую функцию заменима?? Очень похожа modf на...

Паскаль не определяет frac(7)
Здравствуйте! Столкнулась сегодня с такой проблемой - паскаль не определяет frac(7). Программа довольно большая, но, как я заметила, именно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru