Двома основними методами є математичний розрахунок (з поліномами) і таблиці пошуку.
Бібліотека математики Arduino (libm, частина avr-libc) використовує першу. Він оптимізований для AVR в тому, що він написаний на 100% мові асемблера, і як такий практично неможливо слідувати тому, що він робить (також є нульові коментарі). Будьте впевнені, хоча це буде найбільш оптимізований чистий плаваючий реалізація мізків набагато вище наших може придумати.
Однак ключ float . Все, що стосується Arduino з плаваючою точкою, буде важким у порівнянні з чистим цілим числом, і оскільки ви тільки запитуєте цілі числа від 0 до 90 градусів, проста таблиця буде найпростішим і найефективнішим методом.
Таблиця з 91 значення дасть вам все від 0 до 90 включно. Однак, якщо ви зробите, що таблиця значень з плаваючою точкою між 0.0 і 1.0, ви все ще маєте неефективність роботи з плаваючими точками (наданими не так неефективно, як обчислення sin
з плаваючими потоками), тому зберігання фіксованого значення точки замість цього було б набагато ефективніше.
Це може бути таким же простим, як збереження значення, помножене на 1000, так що ви маєте від 0 до 1000, а не від 0,0 до 1,0 (наприклад, sin (30) буде зберігатися як 500 замість 0,5). Більш ефективним буде збереження значень як, наприклад, значення Q16, де кожне значення (біт) представляє 1/65536th з 1.0. Ці значення Q16 (і відповідні Q15, Q1.15 і т.д.) є більш ефективними для роботи, оскільки у вас є потужність двох, з якою комп'ютери люблять працювати, а не з десятьма силами, з якими вони ненавидять працювати.
Не забувайте також, що функція sin()
очікує радіанів, тому спочатку потрібно перетворити цілі градуси у значення з радіанами з плаваючою точкою, використовуючи sin()
ще більш неефективний в порівнянні з таблицею пошуку, яка може працювати безпосередньо з цілими значеннями градусів.
Однак можливе поєднання цих двох сценаріїв. Лінійна інтерполяція дозволить отримати наближення кута з плаваючою точкою між двома цілими числами. Це так само просто, як розробити, наскільки далеко між двома точками у таблиці пошуку є і створювати зважене середнє на основі цієї відстані двох значень. Наприклад, якщо ви знаходитесь на 23,6 градусах, ви берете (синтіва [23] * (1-0,6)) + (синтіва [24] * 0,6)
. В основному ваша синусова хвиля стає серією дискретних точок, з'єднаних прямими лініями. Ви торгуєте точністю для швидкості.