stringtranslate.com

КОРДИК

CORDIC ( цифровой компьютер вращения координат ), алгоритм Вольдера , метод цифр за цифрой , круговой CORDIC ( Джек Э. Вольдер ), [1] [2] линейный CORDIC , гиперболический CORDIC (Джон Стивен Вальтер), [3] [4] и обобщенный гиперболический CORDIC ( GH CORDIC ) (Юаньонг Ло и др.), [5] [6] — это простой и эффективный алгоритм для вычисления тригонометрических функций , гиперболических функций , квадратных корней , умножений , делений , экспонент и логарифмов с произвольным основанием, обычно сходящихся с одной цифрой (или битом) за итерацию. Таким образом, CORDIC также является примером алгоритмов цифр за цифрой . CORDIC и тесно связанные методы, известные как псевдоумножение и псевдоделение или комбинирование факторов, обычно используются, когда нет аппаратного умножителя (например, в простых микроконтроллерах и программируемых пользователем вентильных матрицах или ПЛИС), поскольку единственные операции, которые им требуются, — это сложения , вычитания , сдвиг битов и таблицы поиска . Таким образом, все они относятся к классу алгоритмов сдвига и сложения . В информатике CORDIC часто используется для реализации арифметики с плавающей точкой , когда на целевой платформе нет аппаратного умножителя по причинам стоимости или пространства.

История

Похожие математические методы были опубликованы Генри Бриггсом еще в 1624 году [7] [8] и Робертом Флауэром в 1771 году [9] , но CORDIC лучше оптимизирован для малосложных конечных процессоров.

CORDIC был задуман в 1956 году [10] [11] Джеком Э. Волдером в отделе аэроэлектроники компании Convair из -за необходимости заменить аналоговый преобразователь в навигационном компьютере бомбардировщика B-58 на более точное и быстрое цифровое решение в реальном времени. [11] Поэтому CORDIC иногда называют цифровым преобразователем. [12] [13]

В своем исследовании Фольдер был вдохновлен формулой из « Справочника по химии и физике» издания CRC 1946 года : [11]

где такое, что , и .

Его исследования привели к внутреннему техническому отчету, предлагающему алгоритм CORDIC для решения функций синуса и косинуса и прототипный компьютер, реализующий его. [10] [11] В отчете также обсуждалась возможность вычисления гиперболического вращения координат , логарифмов и экспоненциальных функций с помощью модифицированных алгоритмов CORDIC. [10] [11] В это же время было задумано использование CORDIC для умножения и деления . [11] Основываясь на принципе CORDIC, Дэн Х. Даггетт, коллега Волдера в Convair, разработал алгоритмы преобразования между двоичными и двоично-десятичными числами (BCD). [11] [14]

В 1958 году компания Convair наконец начала строить демонстрационную систему для решения проблем определения местоположения радаров под названием CORDIC I , завершенную в 1960 году без Волдера, который уже покинул компанию. [1] [11] Более универсальные модели CORDIC II A (стационарная) и B (бортовая) были построены и испытаны Даггеттом и Гарри Шуссом в 1962 году. [11] [15]

Алгоритм CORDIC Фольдера был впервые публично описан в 1959 году, [1] [2] [11] [13] [16], что привело к его внедрению в навигационные компьютеры такими компаниями, как Martin-Orlando , Computer Control , Litton , Kearfott , Lear-Siegler , Sperry , Raytheon и Collins Radio . [11]

Волдер объединился с Малкольмом Макмилланом для создания Athena , настольного калькулятора с фиксированной точкой, использующего его двоичный алгоритм CORDIC. [17] Проект был представлен Hewlett-Packard в июне 1965 года, но не принят. [17] Тем не менее, Макмиллан познакомил Дэвида С. Кохрана (HP) с алгоритмом Волдера, и когда Кохран позже встретился с Волдером, он указал ему на похожий подход, предложенный Джоном Э. Меггиттом (IBM [18] ) в качестве псевдоумножения и псевдоделения в 1961 году. [18] [19] Метод Меггитта также предполагал использование основания 10 [18] вместо основания 2 , как использовалось в CORDIC Волдера до сих пор. Эти усилия привели к реализации логики ROMable для прототипа десятичной машины CORDIC внутри Hewlett-Packard в 1966 году [20] [19], созданной и концептуально производной от прототипа Green Machine Томаса Э. Осборна , четырехфункционального настольного калькулятора с плавающей точкой, который он завершил в DTL- логике [17] в декабре 1964 года. [21] Результатом этого проекта стала публичная демонстрация первого настольного калькулятора Hewlett-Packard с научными функциями, HP 9100A , в марте 1968 года, а серийное производство началось в том же году. [17] [21] [22] [23]

Когда в Wang Laboratories обнаружили, что HP 9100A использовал подход, аналогичный методу комбинирования факторов в их более ранних настольных калькуляторах LOCI-1 [24] (сентябрь 1964 г.) и LOCI-2 (январь 1965 г.) [25] [26] Logarithmic Computing Instrument , [27] они безуспешно обвинили Hewlett-Packard в нарушении одного из патентов Ань Вана в 1968 г. [19] [28] [29] [30]

Джон Стивен Уолтер из Hewlett-Packard обобщил алгоритм в унифицированный алгоритм CORDIC в 1971 году, что позволило ему вычислять гиперболические функции , натуральные экспоненты , натуральные логарифмы , умножения , деления и квадратные корни . [31] [3] [4] [32] Подпрограммы CORDIC для тригонометрических и гиперболических функций могли совместно использовать большую часть своего кода. [28] Эта разработка привела к появлению первого научного карманного калькулятора HP -35 в 1972 году. [28] [33] [34] [35] [36] [37] Основываясь на гиперболическом CORDIC, Юаньонг Ло и др. В 2019 году был предложен обобщенный гиперболический CORDIC (GH CORDIC) для непосредственного вычисления логарифмов и экспонент с произвольным фиксированным основанием. [5] [6] [38] [39] [40] Теоретически гиперболический CORDIC является частным случаем GH CORDIC. [5]

Первоначально CORDIC был реализован только с использованием двоичной системы счисления , и, несмотря на то, что Меггитт предложил использовать десятичную систему для своего подхода к псевдоумножению, десятичная CORDIC продолжала оставаться практически неизвестной в течение еще нескольких лет, так что Герман Шмид и Энтони Богацки все еще предлагали ее как новинку еще в 1973 году [16] [13] [41] [42] [43] , и только позже было обнаружено, что Hewlett-Packard реализовала ее еще в 1966 году. [11] [13] [20] [28]

Десятичный CORDIC стал широко использоваться в карманных калькуляторах , [13] большинство из которых работают в двоично-десятичном коде (BCD), а не в двоичном. Это изменение формата ввода и вывода не изменило основные алгоритмы вычислений CORDIC. CORDIC особенно хорошо подходит для карманных калькуляторов, в которых низкая стоимость — и, следовательно, малое количество вентилей чипа — гораздо важнее скорости.

CORDIC был реализован в сопроцессорах серии STM32G4 на базе ARM , Intel 8087 , [43] [44] [45] [46] [47] 80287 , [47] [48] 80387 [47] [48] вплоть до 80486 [43], а также в Motorola 68881 [43] [44] и 68882 для некоторых видов инструкций с плавающей точкой, в основном как способ уменьшения количества вентилей (и сложности) подсистемы FPU .

Приложения

CORDIC использует простые операции сдвига-сложения для нескольких вычислительных задач, таких как вычисление тригонометрических, гиперболических и логарифмических функций, действительных и комплексных умножений, деления, вычисления квадратного корня, решения линейных систем, оценки собственных значений , разложения сингулярных значений , QR-факторизации и многих других. Как следствие, CORDIC использовался для приложений в различных областях, таких как обработка сигналов и изображений , системы связи , робототехника и 3D-графика, помимо общих научных и технических вычислений. [49] [50]

Аппаратное обеспечение

Алгоритм использовался в навигационной системе лунного транспортного средства программы «Аполлон» для вычисления пеленга и дальности или расстояния от лунного модуля . [51] [52] CORDIC использовался для реализации математического сопроцессора Intel 8087 в 1980 году, что позволило избежать необходимости внедрения аппаратного умножения. [53]

CORDIC, как правило, быстрее других подходов, когда аппаратный умножитель недоступен (например, микроконтроллер) или когда количество вентилей, необходимых для реализации поддерживаемых им функций, должно быть сведено к минимуму (например, в FPGA или ASIC ). Фактически, CORDIC является стандартным IP -адресом в приложениях разработки FPGA, таких как Vivado для Xilinx, в то время как реализация степенного ряда не является таковой из-за специфики такого IP, то есть CORDIC может вычислять множество различных функций (общего назначения), в то время как аппаратный умножитель, настроенный на выполнение реализаций степенного ряда, может вычислять только ту функцию, для которой он был разработан.

С другой стороны, когда доступен аппаратный множитель ( например , в микропроцессоре DSP ), методы табличного поиска и степенные ряды обычно быстрее, чем CORDIC. В последние годы алгоритм CORDIC широко использовался для различных биомедицинских приложений, особенно в реализациях FPGA. [ необходима цитата ]

Серия STM32G4 и некоторые серии STM32H7 микроконтроллеров реализуют модуль CORDIC для ускорения вычислений в различных приложениях со смешанными сигналами, таких как графика для интерфейса человек-машина и ориентированное на поле управление двигателями. Хотя CORDIC не так быстр, как аппроксимация степенного ряда, он действительно быстрее, чем реализации на основе интерполяционных таблиц, такие как те, которые предоставляются стандартными библиотеками ARM CMSIS и C. [54] Хотя результаты могут быть немного менее точными, поскольку предоставленные модули CORDIC достигают только 20 бит точности в результате. Например, большая часть разницы в производительности по сравнению с реализацией ARM обусловлена ​​накладными расходами алгоритма интерполяции, который достигает полной точности с плавающей запятой (24 бита) и, вероятно, может достигать относительной погрешности по сравнению с этой точностью. [55] Другим преимуществом является то, что модуль CORDIC является сопроцессором и может работать параллельно с другими задачами ЦП.

Проблема с использованием рядов Тейлора заключается в том, что, хотя они и обеспечивают небольшую абсолютную ошибку, они не демонстрируют хорошо ведущую себя относительную ошибку. [56] Другие средства полиномиальной аппроксимации, такие как минимаксная оптимизация, могут использоваться для контроля обоих видов ошибок.

Программное обеспечение

Многие старые системы с целочисленными процессорами реализовали CORDIC в той или иной степени как часть своих библиотек с плавающей точкой IEEE . Поскольку большинство современных универсальных процессоров имеют регистры с плавающей точкой с общими операциями, такими как сложение, вычитание, умножение, деление, синус, косинус, квадратный корень, логарифм 10 , натуральный логарифм, необходимость реализации CORDIC в них с помощью программного обеспечения практически отсутствует. Только микроконтроллеры или специальные приложения безопасности и ограничения по времени должны рассмотреть возможность использования CORDIC.

Режимы работы

Режим вращения

CORDIC можно использовать для вычисления ряда различных функций. Это объяснение показывает, как использовать CORDIC в режиме вращения для вычисления синуса и косинуса угла, предполагая, что желаемый угол задан в радианах и представлен в формате с фиксированной точкой. Чтобы определить синус или косинус для угла , необходимо найти координату y или x точки на единичной окружности, соответствующей желаемому углу. Используя CORDIC, можно начать с вектора :

Иллюстрация алгоритма CORDIC в процессе работы

В первой итерации этот вектор поворачивается на 45° против часовой стрелки, чтобы получить вектор . Последовательные итерации поворачивают вектор в одном или другом направлении с шагом уменьшения размера, пока не будет достигнут желаемый угол. Каждый шаг угла составляет для .

Более формально, каждая итерация вычисляет поворот, который выполняется путем умножения вектора на матрицу поворота :

Матрица вращения определяется как

Используя тригонометрическое тождество :

косинусный множитель можно вычесть и получить:

Тогда выражение для повернутого вектора становится следующим:

где и являются компонентами . Установка угла для каждой итерации таким образом, что все еще дает ряд, который сходится к каждому возможному выходному значению. Умножение с тангенсом, таким образом, может быть заменено делением на степень двойки, что эффективно выполняется в цифровом компьютерном оборудовании с использованием битового сдвига . Тогда выражение становится:

и используется для определения направления вращения: если угол положительный, то он равен +1, в противном случае он равен −1.

Для замены косинуса можно использовать следующее тригонометрическое тождество:

,

задавая этот множитель для каждой итерации:

Затем факторы можно извлечь из итеративного процесса и применить все сразу с коэффициентом масштабирования :

которая вычисляется заранее и сохраняется в таблице или как одна константа, если число итераций фиксировано. Эта коррекция также может быть сделана заранее, путем масштабирования и, следовательно, сохранения умножения. Кроме того, можно отметить, что [43]

чтобы позволить дальнейшее снижение сложности алгоритма. Некоторые приложения могут избегать коррекции вообще, что приводит к выигрышу в обработке : [57]

После достаточного количества итераций угол вектора будет близок к желаемому углу . Для большинства обычных целей  достаточно 40 итераций ( n = 40), чтобы получить правильный результат с точностью до 10-го знака после запятой.

Остается только определить, должно ли вращение быть по часовой стрелке или против часовой стрелки на каждой итерации (выбрав значение ). Это делается путем отслеживания того, насколько был повернут угол на каждой итерации, и вычитания этого значения из желаемого угла; затем, чтобы приблизиться к желаемому углу , если он положительный, вращение происходит по часовой стрелке, в противном случае он отрицательный, и вращение происходит против часовой стрелки:

Значения также должны быть предварительно вычислены и сохранены. Для малых углов его можно аппроксимировать с помощью , чтобы уменьшить размер таблицы.

Как видно на иллюстрации выше, синус угла — это координата y конечного вектора , а координата x — это значение косинуса.

Режим векторизации

Описанный выше алгоритм режима вращения может вращать любой вектор (не только единичный вектор, выровненный вдоль оси x ) на угол от −90° до +90°. Решения о направлении вращения зависят от того, является ли оно положительным или отрицательным.

Режим векторизации требует небольшой модификации алгоритма. Он начинается с вектора, координата x которого положительна, а координата y произвольна. Последовательные вращения имеют целью поворот вектора к оси x (и, следовательно, уменьшение координаты y до нуля). На каждом шаге значение y определяет направление вращения. Конечное значение содержит полный угол поворота. Конечное значение x будет величиной исходного вектора, масштабированной на K. Таким образом, очевидным применением режима векторизации является преобразование из прямоугольных координат в полярные.

Выполнение

В Java класс Math имеет scalb(double x,int scale)метод для выполнения такого сдвига, [58] в C есть функция ldexp , [59] а класс процессоров x86 имеет fscaleоперацию с плавающей точкой. [60]

Пример программного обеспечения (Python)

из  математики  импортировать  atan2 ,  sqrt ,  sin ,  cos ,  радианыИТЭР  =  16theta_table  =  [ atan2 ( 1 ,  2 ** i )  для  i  в  диапазоне ( ITERS )]определение  compute_K ( n ): """ Вычислить K(n) для n = ITERS. Это также может быть сохраняется как явная константа, если указанное выше значение ITERS фиксировано. """ к  =  1,0 для  i  в  диапазоне ( n ): k  *=  1  /  sqrt ( 1  +  2  **  ( - 2  *  i )) возвращение  кdef  CORDIC ( альфа ,  н ): K_n  =  вычислить_K ( n ) тета  =  0,0 х  =  1,0 у  =  0,0 P2i  =  1  # Это будет 2**(-i) в цикле ниже для  arc_tangent  в  theta_table : сигма  =  + 1  , если  тета  <  альфа,  иначе  - 1 тета  +=  сигма  *  арктангенс x ,  y  =  x  -  сигма  *  y  *  P2i ,  сигма  *  P2i  *  x  +  y P2i  /=  2 вернуть  х  *  К_н ,  у  *  К_несли  __name__  ==  "__main__" : # Распечатать таблицу вычисленных синусов и косинусов от -90° до +90° с шагом 15°, # сравнение с доступными математическими процедурами. print ( " x sin(x) дифф. синус cos(x) дифф. косинус " ) для  x  в  диапазоне ( - 90 ,  91 ,  15 ): cos_x ,  sin_x  =  CORDIC ( радианы ( x ),  ИТЕРЫ ) печать ( f " { x : +05.1f } ° { sin_x : +.8f } ( { sin_x - sin ( радианы ( x )) : +.8f } ) { cos_x : +.8f } ( { cos_x - cos ( радианы ( x )) : +.8f } )" )

Выход

$ python  cordic.py  x sin(x) диф. синус cos(x) диф. косинус -90,0° -1,00000000 (+0,00000000) -0,00001759 (-0,00001759) -75,0° -0,96592181 (+0,00000402) +0,25883404 (+0,00001499) -60,0° -0,86601812 (+0,00000729) +0,50001262 (+0,00001262) -45,0° -0,70711776 (-0,00001098) +0,70709580 (-0,00001098) -30,0° -0,50001262 (-0,00001262) +0,86601812 (-0,00000729) -15,0° -0,25883404 (-0,00001499) +0,96592181 (-0,00000402) +00,0° +0,00001759 (+0,00001759) .00000000 ( -0,00000000) +15,0° +0,25883404 (+0,00001499) +0,96592181 (-0,00000402) +30,0° +0,50001262 (+0,00001262) +0,86601812 (-0,00000729) +45,0° +0,70709580 (-0,00001098) +0,70711776 (+0,00001098) +60,0° +0,86601812 (-0,00000729) +0,50001262 (+0,00001262 +7) 5,0° +0,96592181 (-0,00000402) +0,25883404 (+0,00001499) +90,0° +1,00000000 (-0,00000000) -0,00001759 (-0,00001759)

Пример оборудования

Количество логических вентилей для реализации CORDIC примерно сопоставимо с количеством, необходимым для умножителя, поскольку оба требуют комбинаций сдвигов и сложений. Выбор реализации на основе умножителя или CORDIC будет зависеть от контекста. Например, умножение двух комплексных чисел, представленных их действительными и мнимыми компонентами (прямоугольными координатами), требует 4 умножений, но может быть реализовано одним CORDIC, работающим с комплексными числами, представленными их полярными координатами, особенно если величина чисел не имеет значения (умножение комплексного вектора на вектор на единичной окружности фактически равно вращению). CORDIC часто используются в схемах для телекоммуникаций, таких как цифровые понижающие преобразователи .

Двойные итерации CORDIC

В двух публикациях Владимира Байкова [61] [62] было предложено использовать метод двойных итераций для реализации функций: арксинус, арккосинус, натуральный логарифм, показательная функция, а также для вычисления гиперболических функций. Метод двойных итераций заключается в том, что в отличие от классического метода CORDIC, где величина шага итерации меняется каждый раз, т.е. на каждой итерации, в методе двойных итераций величина шага итерации повторяется дважды и изменяется только через одну итерацию. Отсюда и появилось обозначение для показателя степени для двойных итераций: . Тогда как при обычных итерациях: . Метод двойных итераций гарантирует сходимость метода во всем допустимом диапазоне изменения аргумента.

Обобщение задач сходимости CORDIC для произвольной позиционной системы счисления с основанием показало [63], что для функций синус, косинус, арктангенс достаточно выполнить итерации для каждого значения i (i = 0 или 1 до n, где n — число цифр), т.е. для каждой цифры результата. Для натурального логарифма, экспоненты, гиперболического синуса, косинуса и арктангенса итерации следует выполнять для каждого значения . Для функций арксинус и арккосинус следует выполнить две итерации для каждой цифры числа, т.е. для каждого значения . [63]

Для функций обратного гиперболического синуса и аркосина число итераций будет для каждого , то есть для каждой цифры результата.

Связанные алгоритмы

CORDIC является частью класса алгоритмов «сдвига и сложения» , как и логарифмические и экспоненциальные алгоритмы, полученные из работы Генри Бриггса. Другим алгоритмом сдвига и сложения, который можно использовать для вычисления многих элементарных функций, является алгоритм BKM , который является обобщением логарифмических и экспоненциальных алгоритмов на комплексную плоскость. Например, BKM можно использовать для вычисления синуса и косинуса действительного угла (в радианах) путем вычисления экспоненты , которая равна . Алгоритм BKM немного сложнее, чем CORDIC, но имеет то преимущество, что ему не нужен масштабный коэффициент ( K ).

Смотрите также

Ссылки

  1. ^ abc Volder, Jack E. (1959-03-03). "The CORDIC Computing Technique" (PDF) . Труды Западной объединенной компьютерной конференции (WJCC) (презентация). Сан-Франциско, Калифорния, США: Национальный объединенный компьютерный комитет (NJCC): 257–261 . Получено 2016-01-02 .
  2. ^ ab Volder, Jack E. (1959-05-25). "The CORDIC Trigonometric Computing Technique" (PDF) . IRE Transactions on Electronic Computers . 8 (3). The Institute of Radio Engineers, Inc. (IRE) (опубликовано в сентябре 1959 г.): 330–334 (переиздание: 226–230). EC-8(3):330–334. Архивировано из оригинала (PDF) 2021-06-12 . Получено 2016-01-01 .
  3. ^ ab Walther, John Stephen (май 1971 г.). Написано в Пало-Альто, Калифорния, США. «Унифицированный алгоритм для элементарных функций» (PDF) . Труды Весенней совместной компьютерной конференции . 38 . Атлантик-Сити, Нью-Джерси, США: Hewlett-Packard Company : 379–385. Архивировано из оригинала (PDF) 2021-06-12 . Получено 2016-01-01 – через Американскую федерацию обществ обработки информации (AFIPS).
  4. ^ ab Walther, John Stephen (июнь 2000 г.). «История унифицированного CORDIC». Журнал обработки сигналов VLSI . 25 (2 (Специальный выпуск о CORDIC)). Хингем, Массачусетс, США: Kluwer Academic Publishers : 107–112. Bibcode : 2000JSPSy..25..107W. doi : 10.1023/A:1008162721424. ISSN  0922-5773. S2CID  26922158.
  5. ^ abc Luo, Yuanyong; Wang, Yuxuan; Ha, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing (сентябрь 2019 г.). «Обобщенный гиперболический CORDIC и его логарифмическое и экспоненциальное вычисление с произвольным фиксированным основанием». Труды IEEE по системам сверхбольшой интеграции (VLSI) . 27 (9): 2156–2169. doi :10.1109/TVLSI.2019.2919557. S2CID  196171166.
  6. ^ ab Luo, Yuanyong; Wang, Yuxuan; Ha, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing (сентябрь 2019 г.). «Исправления к «Обобщенному гиперболическому CORDIC и его логарифмическому и экспоненциальному вычислению с произвольным фиксированным основанием»". Труды IEEE по системам сверхбольшой интеграции (VLSI) . 27 (9): 2222. doi :10.1109/TVLSI.2019.2932174. S2CID  201711001.
  7. Бриггс, Генри (1624). Arithmetica Logarithmica . Лондон.(Перевод: [1] Архивировано 4 марта 2016 г. на Wayback Machine )
  8. ^ Лапорт, Жак (2014) [2005]. «Генри Бриггс и HP 35». Париж, Франция. Архивировано из оригинала 2015-03-09 . Получено 2016-01-02 .[2] Архивировано 10 августа 2020 г. на Wayback Machine
  9. ^ Флауэр, Роберт (1771). Радикс. Новый способ создания логарифмов. Лондон: J. Beecroft . Получено 2016-01-02 .
  10. ^ abc Volder, Jack E. (1956-06-15), Двоичные алгоритмы вычислений для вращения координат и генерации функций (внутренний отчет), Convair , Группа аэроэлектроники, IAR-1.148
  11. ^ abcdefghijkl Volder, Jack E. (июнь 2000 г.). "Рождение CORDIC" (PDF) . Журнал обработки сигналов VLSI . 25 (2 (Специальный выпуск о CORDIC)). Hingham, MA, USA: Kluwer Academic Publishers : 101–105. Bibcode :2000JSPSy..25..101V. doi :10.1023/A:1008110704586. ISSN  0922-5773. S2CID  112881. Архивировано из оригинала (PDF) 2016-03-04 . Получено 2016-01-02 .
  12. ^ Перл, Майкл Д. (июнь 1971 г.), «Метод CORDIC сокращает поиск тригонометрических функций», Computer Design , Бостон, Массачусетс, США: Computer Design Publishing Corp.: 72–78(Примечание. Некоторые источники ошибочно ссылаются на это как на PZ Perle или на Component Design .)
  13. ^ abcde Schmid, Hermann (1983) [1974]. Decimal Computation (1 (переиздание) изд.). Малабар, Флорида, США: Robert E. Krieger Publishing Company. стр. 162, 165–176, 181–193. ISBN 0-89874-318-4. Получено 2016-01-03 .(Примечание. По крайней мере некоторые партии этого переиздания были опечатками с дефектными страницами 115–146.)
  14. ^ Даггетт, Дэн Х. (сентябрь 1959 г.). «Десятично-двоичные преобразования в CORDIC». Труды IRE по электронным компьютерам . 8 (3). Институт радиоинженеров, Inc. (IRE): 335–339. doi :10.1109/TEC.1959.5222694. ISSN  0367-9950. EC-8(3):335–339 . Получено 02.01.2016 .
  15. ^ Advanced Systems Group (1962-08-06), Техническое описание оборудования для фиксации и крепления (отчет), Форт-Уорт, Техас, США: General Dynamics , FZE-052
  16. ^ ab Schmid, Hermann (1974). Decimal Computation (1-е изд.). Бингемтон, Нью-Йорк, США: John Wiley & Sons, Inc. стр. 162, 165–176, 181–193. ISBN 0-471-76180-X. Получено 2016-01-03 . До сих пор известно, что CORDIC реализован только в двоичной форме. Но, как будет показано здесь, алгоритм можно легко модифицировать для десятичной системы.* […] *Тем временем стало известно, что Hewlett-Packard и другие производители калькуляторов используют десятичные методы CORDIC в своих научных калькуляторах.
  17. ^ abcd Лейбсон, Стивен (2010). "Проект HP 9100: экзотермическая реакция" . Получено 2016-01-02 .
  18. ^ abc Meggitt, John E. (1961-08-29). "Pseudo Division and Pseudo Multiplication Processes" (PDF) . IBM Journal of Research and Development . 6 (2). Riverton, New Jersey, USA: IBM Corporation (опубликовано в апреле 1962 г.): 210–226, 287. doi :10.1147/rd.62.0210. Архивировано из оригинала (PDF) 2022-02-04 . Получено 2016-01-09 . John E. Meggitt BA, 1953; PhD, 1958, Cambridge University . Награжден Первой премией Смита в Кембридже в 1955 году и избран научным сотрудником в Emmanuel College . […] В 1958 году присоединился к Британской лаборатории IBM в Херсли, Винчестер. Интересы включают коды исправления ошибок и небольшие микропрограммные компьютеры.([3], [4])
  19. ^ abc Cochran, David S. (2010-11-19). "A Quarter Century at HP" (машинописный текст интервью). Computer History Museum / HP Memories. 7: Scientific Calculators, около 1966. CHM X5992.2011 . Получено 2016-01-02 . Я даже полетел в Южную Калифорнию, чтобы поговорить с Джеком Волдером, который реализовал трансцендентные функции в машине Athena , и проговорил с ним около часа. Он отослал меня к оригинальным статьям Меггитта, где он получил обобщенные функции псевдоделения, псевдоумножения. […] Я провел довольно много литературных исследований, что привело к некоторым очень интересным открытиям. […] Я нашел трактат Генри Бриггса 1624 года , в котором обсуждалось вычисление десятичных логарифмов, что интересно, использовался тот же метод псевдоделения/псевдоумножения, который Макмиллан и Волдер использовали в Athena . […] Мы приобрели LOCI-2 у Wang Labs и узнали, что Wang Labs LOCI II использует тот же алгоритм для вычисления квадратного корня, а также логарифма и экспоненты. После появления 9100 наш юридический отдел получил письмо от Wang, в котором говорилось, что мы нарушили их патент. И я просто отправил ответную записку со ссылкой на Briggs на латыни, в которой говорилось: «Мне кажется, это прототип ». Больше мы ничего не услышали.([5])
  20. ^ ab Cochran, David S. (1966-03-14), Об использовании CORDIC для вычисления трансцендентных функций в BCD (частное общение с Джеком Э. Волдером)
  21. ^ ab Osborne, Thomas E. (2010) [1994]. "История Тома Осборна его собственными словами" . Получено 01.01.2016 .
  22. ^ Лейбсон, Стивен (2010). "HP 9100: Начальный путь" . Получено 2016-01-02 .
  23. ^ Cochran, David S. (сентябрь 1968). «Внутреннее программирование калькулятора 9100A». Hewlett-Packard Journal . Пало-Альто, Калифорния, США: Hewlett-Packard : 14–16 . Получено 2016-01-02 .([6])
  24. ^ Расширьте возможности своего персонального компьютера с помощью нового логарифмического вычислительного прибора LOCI-1, Wang Laboratories, Inc. , 1964, стр. 2–3 , получено 03.01.2016
  25. ^ Бенсен, Рик (2013-08-31) [1997]. "Wang LOCI-2". Старый веб-музей калькуляторов . Биверкрик, Орегон-Сити, Орегон, США . Получено 2016-01-03 .
  26. ^ "Руководство по обслуживанию Wang LOCI" (PDF) . Wang Laboratories, Inc. 1967. L55-67 . Получено 2018-09-14 .
  27. ^ Бенсен, Рик (2004-10-23) [1997]. "Система калькулятора Wang Model 360SE". Веб-музей старых калькуляторов . Биверкрик, Орегон-Сити, штат Орегон, США . Получено 03.01.2016 .
  28. ^ abcd Cochran, David S. (июнь 2010 г.). "The HP-35 Design, A Case Study in Innovation". HP Memory Project . Получено 2016-01-02 . Во время разработки настольного калькулятора HP 9100 я отвечал за разработку алгоритмов, соответствующих архитектуре, предложенной Томом Осборном. Хотя предложенная методология для алгоритмов исходила от Малкольма Макмиллана, я прочитал много литературы, чтобы понять основные вычисления […] Хотя Wang Laboratories использовали похожие методы вычислений, мое исследование обнаружило предшествующее искусство от 1624 года, которое гласило об их патентах. […] Это исследование позволило адаптировать трансцендентные функции с помощью алгоритмов для соответствия потребностям заказчика в рамках ограничений оборудования. Это оказалось бесценным во время разработки HP -35 , […] Степенные ряды , полиномиальные разложения , непрерывные дроби и полиномы Чебышева — все это рассматривалось для трансцендентных функций. Все они были слишком медленными из-за количества требуемых умножений и делений. Обобщенный алгоритм, который лучше всего соответствовал требованиям скорости и эффективности программирования для HP-35, был итеративным методом псевдоделения и псевдоумножения, впервые описанным в 1624 году Генри Бриггсом в « Arithmetica Logarithmica », а затем Волдером и Меггиттом. Это тот же тип алгоритма, который использовался в предыдущих настольных калькуляторах HP. […] Сложность алгоритмов сделала многоуровневое программирование необходимостью. Это означало, что калькулятор должен был иметь возможность подпрограмм, […] Для генерации трансцендентной функции, такой как Arc-Hyperbolic-Tan, требовалось несколько уровней подпрограмм. […] Крис Клэр позже задокументировал это как методологию алгоритмического конечного автомата (ASM). Даже простые синус или косинус использовали процедуру тангенса, а затем вычисляли синус из тригонометрических тождеств. Эти трудоемкие манипуляции были необходимы для минимизации количества уникальных программ и шагов программы […] Набор арифметических инструкций был разработан специально для калькулятора десятичных трансцендентных функций. Основные арифметические операции выполняются сумматором -вычитателем с дополнением до 10 , который имеет пути данных к трем регистрам, используемым в качестве рабочей памяти.
  29. ^ Патент США 3402285A, Ван, Ан , «Вычислительный аппарат», опубликован 1968-09-17, выдан 1968-09-17, передан Wang Laboratories  ([7], [8])
  30. ^ Патент DE 1499281B1, Ван, Ан , "Rechenmaschine fuer logarithmische Rechnungen", опубликован 6 мая 1970 г., выдан 6 мая 1970 г., передан Wang Laboratories ([9]). 
  31. ^ Шварцлендер, младший, Эрл Э. (1990). Компьютерная арифметика. Том 1 (2-е изд.). Лос-Аламитос: IEEE Computer Society Press . ISBN 9780818689314. 0818689315 . Получено 2016-01-02 .
  32. ^ Петрочелли, Орландо Р., ред. (1972), Лучшие компьютерные статьи 1971 года, Auerbach Publishers , стр. 71, ISBN 0877691274, получено 2016-01-02
  33. ^ Cochran, David S. (июнь 1972 г.). «Алгоритмы и точность в HP-35» (PDF) . Hewlett-Packard Journal . 23 (10): 10–11. Архивировано из оригинала (PDF) 2013-10-04 . Получено 2016-01-02 .
  34. ^ Лапорт, Жак (2005-12-06). "Тригонометрический алгоритм HP35". Париж, Франция. Архивировано из оригинала 2015-03-09 . Получено 2016-01-02 .[10] Архивировано 10 августа 2020 г. на Wayback Machine
  35. ^ Лапорт, Жак (февраль 2005 г.) [1981]. «Секрет алгоритмов». L'Ordinateur Individuel (24). Париж, Франция. Архивировано из оригинала 2016-08-18 . Получено 2016-01-02 .[11] Архивировано 12 июня 2021 г. на Wayback Machine
  36. ^ Лапорт, Жак (февраль 2012 г.) [2006]. «Цифра за цифрой методы». Париж, Франция. Архивировано из оригинала 2016-08-18 . Получено 2016-01-02 .[12] Архивировано 12 июня 2021 г. на Wayback Machine
  37. ^ Лапорт, Жак (февраль 2012 г.) [2007]. "Алгоритм логарифма HP 35". Париж, Франция. Архивировано из оригинала 2016-08-18 . Получено 2016-01-07 .[13] Архивировано 10 августа 2020 г. на Wayback Machine
  38. ^ Ван, Юйсюань; Ло, Юаньонг; Ван, Чжунфэн; Шэнь, Цинхун; Пан, Хунбин (январь 2020 г.). «Архитектура на основе GH CORDIC для вычисления корня N-го числа с плавающей точкой одинарной точности». Труды IEEE по системам сверхбольшой интеграции (VLSI) . 28 (4): 864–875. doi :10.1109/TVLSI.2019.2959847. S2CID  212975618.
  39. ^ Мопури, Суреш; Ачарья, Амит (сентябрь 2019 г.). «Методология проектирования архитектуры низкосложных универсальных СБИС для вычислений N-го корня и N-й степени». Труды IEEE по схемам и системам I: Регулярные статьи . 66 (12): 4673–4686. doi :10.1109/TCSI.2019.2939720. S2CID  203992880.
  40. ^ Vachhani, Leena (ноябрь 2019 г.). «CORDIC как коммутируемая нелинейная система». Circuits, Systems and Signal Processing . 39 (6): 3234–3249. doi :10.1007/s00034-019-01295-8. S2CID  209904108.
  41. ^ Шмид, Герман ; Богацки, Энтони (1973-02-20). «Использование десятичного CORDIC для генерации многих трансцендентных функций». EDN : 64–73.
  42. ^ Франке, Ричард (1973-05-08). Анализ алгоритмов аппаратной оценки элементарных функций (PDF) . Монтерей, Калифорния, США: Департамент ВМС , Военно-морская аспирантура . NPS-53FE73051A . Получено 2016-01-03 .
  43. ^ abcde Мюллер, Жан-Мишель (2006). Элементарные функции: алгоритмы и реализация (2-е изд.). Бостон: Birkhäuser . стр. 134. ISBN 978-0-8176-4372-0. LCCN  2005048094 . Получено 01.12.2015 .
  44. ^ ab Nave, Rafi (март 1983 г.). «Реализация трансцендентных функций на числовом процессоре». Микропроцессорная обработка и микропрограммирование . 11 (3–4): 221–225. doi :10.1016/0165-6074(83)90151-5.
  45. ^ Палмер, Джон Ф.; Морзе, Стивен Пол (1984). 8087 Primer (1-е изд.). John Wiley & Sons Australia, Limited . ISBN 0471875694. 9780471875697 . Получено 2016-01-02 .
  46. Glass, L. Brent (январь 1990 г.). «Математические сопроцессоры: взгляд на то, что они делают и как они это делают». Байт . 15 (1): 337–348. ISSN  0360-5280.
  47. ^ abc Джарвис, Питтс (1990-10-01). «Реализация алгоритмов CORDIC – Единая компактная процедура для вычисления трансцендентных функций». Журнал доктора Добба : 152–156. Архивировано из оригинала 2016-03-04 . Получено 2016-01-02 .
  48. ^ ab Yuen, AK (1988). «Процессоры Intel с плавающей точкой». Отчет конференции Electro/88 : 48/5/1–7.
  49. ^ Мехер, Прамод Кумар; Вальс, Хавьер; Хуанг, Цо-Бинг; Шридхаран, К.; Махаратна, Кошик (2008-08-22). "50 лет CORDIC: алгоритмы, архитектуры и приложения" (PDF) . Труды IEEE по схемам и системам I: Регулярные статьи . 56 (9) (опубликовано 2009-09-09): 1893–1907. doi :10.1109/TCSI.2009.2025803. S2CID  5465045.
  50. ^ Мехер, Прамод Кумар; Пак, Санг Юн (февраль 2013 г.). «Методология проектирования архитектуры общих СБИС низкой сложности для вычислений корня N-й степени и степени N-й степени». Труды IEEE по системам сверхбольшой интеграции (СБИС) . 21 (2): 217–228. doi :10.1109/TVLSI.2012.2187080. S2CID  7059383.
  51. ^ Хеффрон, WG; ЛаПиана, Ф. (1970-12-11). «Технический меморандум 70-2014-8: Навигационная система лунного вездехода» (PDF) . NASA . Вашингтон, округ Колумбия, США: Bellcomm . стр. 14.
  52. ^ Смит, Эрнест К.; Мастин, Уильям К. (ноябрь 1973 г.). «Техническая записка D-7469: Обзор характеристик навигационной системы лунного транспортного средства» (PDF) . НАСА . Хантсвилл, Алабама, США: Центр космических полетов им. Маршалла . стр. 17.
  53. ^ Ширрифф, Кен (май 2020 г.). «Извлечение констант ПЗУ из кристалла математического сопроцессора 8087». righto.com . Получено 03.09.2020 . ПЗУ содержит 16 значений арктангенса, арктангенсов 2 −n . Оно также содержит 14 значений логарифма, логарифмов по основанию 2 от (1+2 −n ). Это может показаться необычными значениями, но они используются в эффективном алгоритме под названием CORDIC, который был изобретен в 1958 г.
  54. ^ "Начало работы с ускорителем CORDIC с использованием пакета микроконтроллера STM32CubeG4" (PDF) . STMicroelectronics . Получено 01.01.2021 .
  55. ^ "CMSIS/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c". Github . ARM . Получено 2021-01-01 .
  56. ^ "Границы погрешности разложения Тейлора для синуса". Math Stack Exchange . Получено 2021-01-01 .
  57. ^ Andraka, Ray (1998). "Обзор алгоритмов CORDIC для компьютеров на базе FPGA" (PDF) . ACM . Северный Кингстаун, Род-Айленд, США: Andraka Consulting Group, Inc. 0-89791-978-5/98/01 . Получено 08.05.2016 .
  58. ^ "Class Math". Java Platform Standard (8-е изд.). Oracle Corporation . 2018 [1993]. Архивировано из оригинала 2018-08-06 . Получено 2018-08-06 .
  59. ^ "ldexp, ldexpf, ldexpl". cppreference.com . 2015-06-11. Архивировано из оригинала 2018-08-06 . Получено 2018-08-06 .
  60. ^ "Раздел 8.3.9 Логарифмическая, экспоненциальная и масштабная". Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 1: Базовая архитектура (PDF) . Корпорация Intel . Сентябрь 2016 г. стр. 8–22.
  61. ^ Байков, Владимир. «Очерк (автореферат) моей докторской диссертации, опубликованной в 1972 году». baykov.de . Получено 2023-05-03 .
  62. ^ Байков, Владимир. «Аппаратная реализация элементарных функций в компьютерах». baykov.de . Получено 2023-05-03 .
  63. ^ ab Байков, Владимир. "Специализированные процессоры: итеративные алгоритмы и структуры". baykov.de . Получено 2023-05-03 .

Дальнейшее чтение

Внешние ссылки