Программистам среди нас
Sep. 28th, 2006 09:23 pmЗадачка:
Имеется N-битный регистр clock, доступный для чтения и сброса в ноль (вариант - только для чтения), к которому каждые p/q секунд (p много меньше q, 2Np/q много больше единицы) по модулю 2N аппаратно прибавляется 1.
Имеется 32-битная переменная time, хранящая текущее время в секундах.
Требуется написать процедуру, которая вызывается сколь угодно часто, но не реже, чем 1 раз в (2N-1)p/q секунд с одним параметром, принимающим значение SET, что значит "в данный момент time содержит истинное время", или UPDATE, после которого time должна содержать значение времени, отличающееся в меньшую сторону от истинного менее чем на 1+p/q секунд. Процедура не должна содержать циклов и работы с плавающей точкой.
Upd: Если допустить работу с числами произвольной разрядности, то это несложно. Хотелось бы обойтись без длинного умножения/деления.
Имеется N-битный регистр clock, доступный для чтения и сброса в ноль (вариант - только для чтения), к которому каждые p/q секунд (p много меньше q, 2Np/q много больше единицы) по модулю 2N аппаратно прибавляется 1.
Имеется 32-битная переменная time, хранящая текущее время в секундах.
Требуется написать процедуру, которая вызывается сколь угодно часто, но не реже, чем 1 раз в (2N-1)p/q секунд с одним параметром, принимающим значение SET, что значит "в данный момент time содержит истинное время", или UPDATE, после которого time должна содержать значение времени, отличающееся в меньшую сторону от истинного менее чем на 1+p/q секунд. Процедура не должна содержать циклов и работы с плавающей точкой.
Upd: Если допустить работу с числами произвольной разрядности, то это несложно. Хотелось бы обойтись без длинного умножения/деления.