Чи є швидша функція синуса?


25

Я працюю над 3d-перлінним шумом. Бібліотека C # Math здається непосильною для того, що мені потрібно, оскільки більшість її функцій використовують подвійну точність. Я використовую Math.Sin () в декількох місцях для створення шуму. Хтось знає про швидшу функцію синуса?

Відповіді:


32

Ви можете використовувати параболу, щоб визначити значення функції синуса. Це має ту перевагу, що коріння рівно -pi / 2 і Pi / 2 , які, як правило , не у випадку з іншими швидких наближень на основі Ряд Тейлора або MaclaurinSeries .

public float Sin(float x)
{
    const float B = 4 / PI;
    const float C = -4 / (PI*PI);

    return -(B * x + C * x * ((x < 0) ? -x : x));
} 

Ось порівняння фактичної функції синуса:

alt текст


3
Це дійсно чудове рішення. Ось чудова стаття від devmaster.net, яка описує, чому це працює, та дає деякі деталі реалізації: devmaster.net/forums/showthread.php?t=5784
reverbb

Я не знаю про C #, але функція abs () у більшості середовищ C, швидше за все, буде швидшою, ніж гілка (оператор?:) При оптимізації.

3
Я видалив виклик Math.Abs ​​(), тому що припустив, що цей код може працювати на Xbox 360 або Windows Phone 7. Компілятор JIT на Xbox 360 нічого не вказує. Дзвінок на Math.Abs ​​() насправді дорожчий.
zfedoran


1
@zfedoran Чому ви заперечуєте значення повернення? Здається, це негативна синусова хвиля.
Даніель Пендергаст

12

Який діапазон вхідних значень для вашої функції sin () ? Для того, для чого ви його використовуєте, здається, що вони можуть бути обмеженими, а значить, ви можете попередньо обчислити значення . Наприклад, якщо ви округляєте вхідні значення до найближчого ступеня, у вас є лише 360 можливих значень - просто попередньо обчисліть їх і зберігайте в таблиці.

Якщо вам потрібно трохи більше значень, скажімо, на один десятковий знак , ви можете інтерполювати з таблиці - я не знайомий із шумом перлин , але, здається, слово "шум" означає, що воно не вимагає високої точності. :) (Ви також можете просто зробити більшу таблицю, 3600 записів - це не так багато місця).


3
Якщо швидкість - це турбота номер один, і ви не проти жертвувати трохи точності, це найкраща відповідь.
AttackingHobo

1
Я не знаю про "найкраще" - Як показано в іншій відповіді, ви можете отримати ще одне дуже хороше наближення в п'ять ops + abs (швидкість якого залежить від вашої арки / компілятора, але часто є безрозгалуженою). Якщо таблиця пошуку не знаходиться в кеші, це буде набагато повільніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.