มีฟังก์ชั่นไซน์ที่เร็วกว่านี้ไหม?


25

ฉันกำลังทำงานเกี่ยวกับการสร้างเสียง perlin 3d ไลบรารี C # Math ดูเหมือนว่าเกินความจำเป็นสำหรับสิ่งที่ฉันต้องการเนื่องจากฟังก์ชั่นส่วนใหญ่ใช้การคิดแบบสองครั้ง ฉันใช้ Math.Sin () ในหลายแห่งเพื่อสร้างเสียง ไม่มีใครรู้ถึงฟังก์ชั่นไซน์ที่เร็วกว่านี้ไหม?

คำตอบ:


32

คุณสามารถใช้พาราโบลาเพื่อประมาณค่าของฟังก์ชันไซน์ นี้มีความได้เปรียบของการมีรากที่ตรง -pi / 2 และปี่ / 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));
} 

นี่เป็นการเปรียบเทียบกับฟังก์ชันไซน์จริง:

ข้อความแสดงแทน


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 ทำไมคุณจึงปฏิเสธค่าที่ส่งคืน? ดูเหมือนว่าจะเป็นคลื่นไซน์ลบ
Daniel Pendergast

12

ช่วงของค่าอินพุตสำหรับฟังก์ชั่นsin ()ของคุณคืออะไร? สำหรับสิ่งที่คุณใช้สำหรับดูเหมือนว่าพวกเขาอาจถูก จำกัด ซึ่งหมายความว่าคุณสามารถคำนวณค่าล่วงหน้าได้ ตัวอย่างเช่นหากคุณกำลังปัดเศษค่าอินพุตให้อยู่ในระดับที่ใกล้ที่สุดคุณจะมีค่าที่เป็นไปได้ 360 ค่า - เพียงคำนวณล่วงหน้าและเก็บไว้ในตาราง

หากคุณต้องการค่าเพิ่มเติมเล็กน้อยพูดกับทศนิยมหนึ่งตำแหน่งคุณสามารถแก้ไขจากตาราง - ฉันไม่คุ้นเคยกับเสียงเพอร์ลิน แต่คำว่า "เสียง" ดูเหมือนว่าจะระบุว่าไม่ต้องการความแม่นยำสูง :) (คุณสามารถสร้างตารางที่ใหญ่กว่าได้ 3600 รายการนั้นไม่มีพื้นที่มากนัก)


3
หากความเร็วเป็นข้อกังวลอันดับหนึ่งของคุณและคุณไม่รังเกียจที่จะเสียสละความแม่นยำนี่เป็นคำตอบที่ดีที่สุด
AttackHobo

1
ฉันไม่รู้เกี่ยวกับ "ดีที่สุด" - ดังที่แสดงในคำตอบอื่นคุณสามารถรับการประมาณที่ดีมากอีกห้า ops + abs (ความเร็วที่ขึ้นอยู่กับส่วนโค้ง / คอมไพเลอร์ของคุณ แต่มักไม่มีสาขา) หากตารางการค้นหาไม่ได้อยู่ในแคชก็จะช้าลงมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.