@kr_ilya

Вычисление значения синуса в машине с бесконечными регистрами (параллельной)?

Есть задание - написать программу для параллельной МБР вычисляющую значение функции "пола" от (sinx +1) *100
6070a1ac3dc30042460210.png
*функция пола - округление до ближайшего целого в меньшую сторону
Описание ПМБР

6070a4640396f635782609.png
Работа ПМБР отличается от работы классической МБР тем, что у нее присутствует возможность параллельного выполнения заданных программ. То есть, в один и тот же момент времени могут выполняться разные команды. В связи с этим, система команд для МБР была расширена некоторыми новыми командами, такими как: запуск программы с последующим параллельным ее выполнением, запись в регистр значения с устройства ввода, запись значения регистра в устройство вывода, блокирование регистра с целью монопольного доступа к нему процессом-блокиратором, разблокировка регистра. Полный список команд для ПМБР имеет следующий синтаксис:

S(n) // Увеличение значения регистра n на 1
T(n, m) // Копирование значения регистра n в регистр m
Z(n) // Обнуление значения регистра n
J(n, m, k) // Условный переход. Если значения регистров m и n равны, то переход к команде с номером k
s(prog, n) /* Запуск программы prog в отдельном потоке и ассоциация её выполнения с регистром-индикатором n.
Перед началом выполнения программы регистр n обнуляется, после выполнения программы в него
заносится единица */
I(n) // Запись значения с устройства ввода с последующей записью его в регистр n
O(n) // Чтение значения регистра n и запись его в устройство вывода
G(n) // Блокировка регистра с номером n с целью монопольного обращения к нему процессом-блокиратором
P(n) // Разблокировка регистра с номером n и разрешение доступа к нему другим процессам

ПРИМЕР

unit Main // Объявление модуля. unit - ключевое слово, Main - название.

entry main // Объявление точки входа.
{
I(0) // Чтение числа в регистр 0
s(test1, 10) // Запуск программы test1 в параллельном процессе и сопоставление с ней регистра-индикатора с номером 10
s(test2, 11) // Запуск программы test2 в параллельном процессе и сопоставление с ней регистра-индикатора с номером 11
}

program test1 // Объявление программного блока
{
S(0) // Инкремент регистра 0
}

program test2
{
T(0, 1) // Копирование значения из регистра 0 в 1
S(1) // Инкремент значения в регистре 1
}



Если прибавить единицу к значению синуса и потом умножить на 100 дело пяти минут, то как вычислить само значение синуса я не могу понять. Загвоздка еще в том, что регистры могут содержать только целые положительные числа, а синус определен на интервале [-1, 1]. Думаю, что есть простое решение без вычисления синуса, но найти я его пока не смог.

Как можно решить поставленную задачу? Буду раз любым советам и идеям алгоритма.

МБР на гитхаб
  • Вопрос задан
  • 270 просмотров
Решения вопроса 1
hint000
@hint000
у админа три руки
как вычислить само значение синуса я не могу понять
https://www.google.com/search?q=sin+степенной+ряд
https://ru.wikipedia.org/wiki/Ряд_Тейлора
https://scask.ru/p_book_mat3.php?id=13
http://www.math24.ru/разложение-функций-в-степенны...

регистры могут содержать только целые положительные числа, а синус определен на интервале [-1, 1]
(sinx +1) *100 = 100*sinx + 100; можно вычислять не sinx, а сразу 100*sinx, будет на интервале [-100, 100];
Хинт: при вычислении суммы ряда можно каждый член ряда сразу умножать на 100.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы