@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.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы