ฉันต้องการขยายคำตอบโดย @Jason S. โดยใช้วิธีการแบ่งโดเมนที่คล้ายกับที่ @Jason S อธิบายและใช้การประมาณชุด Maclaurin ค่าเฉลี่ย (2-3) X speedup เหนือ tan (), sin () ฟังก์ชัน cos (), atan (), asin () และ acos () ที่สร้างขึ้นในคอมไพเลอร์ gcc ที่มีการเพิ่มประสิทธิภาพ -O3 ฟังก์ชั่นการประมาณชุด Maclaurin ที่ดีที่สุดที่อธิบายไว้ด้านล่างนี้มีความแม่นยำสองเท่า
สำหรับฟังก์ชัน tan (), sin () และ cos () และเพื่อความเรียบง่ายโดเมน 0 ถึง 2pi + pi / 80 ที่ทับซ้อนกันถูกแบ่งออกเป็น 81 ช่วงเวลาเท่า ๆ กันโดยมี "จุดยึด" ที่ pi / 80, 3pi / 80, ... , 161pi / 80 จากนั้นจึงทำการประเมินและจัดเก็บ tan (), sin () และ cos () จาก 81 จุดยึด ด้วยความช่วยเหลือของข้อมูลประจำตัวตรีโกณมิติฟังก์ชันชุด Maclaurin เดียวได้รับการพัฒนาสำหรับฟังก์ชันตรีโกณ มุมใด ๆ ที่อยู่ระหว่าง±อินฟินิตี้อาจถูกส่งไปยังฟังก์ชันการประมาณค่าตรีโกณมิติเนื่องจากฟังก์ชันแรกจะแปลมุมอินพุตเป็นโดเมน 0 ถึง 2pi ค่าโสหุ้ยการแปลนี้รวมอยู่ในค่าใช้จ่ายโดยประมาณ
วิธีการที่คล้ายกันได้รับการพัฒนาสำหรับฟังก์ชัน atan (), asin () และ acos () โดยที่โดเมน -1.0 ถึง 1.1 ที่ทับซ้อนกันถูกแบ่งออกเป็น 21 ช่วงเวลาเท่า ๆ กันโดยมีจุดยึดที่ -19/20, -17/20, .. ., 19/20, 21/20 จากนั้นจะจัดเก็บเฉพาะ atan () จากจุดยึดทั้ง 21 จุดเท่านั้น อีกครั้งด้วยความช่วยเหลือของเอกลักษณ์ตรีโกณมิติฟังก์ชันชุดเดียวของ Maclaurin ได้รับการพัฒนาสำหรับฟังก์ชัน atan () ผลลัพธ์ของฟังก์ชัน atan () ถูกใช้เพื่อประมาณ asin () และ acos ()
เนื่องจากฟังก์ชันการประมาณค่าทริกเกอร์ผกผันทั้งหมดจะขึ้นอยู่กับฟังก์ชันการประมาณค่า atan () จึงอนุญาตให้ใช้ค่าอินพุตอาร์กิวเมนต์ที่มีความแม่นยำสองเท่า อย่างไรก็ตามอินพุตอาร์กิวเมนต์สำหรับฟังก์ชันการประมาณ asin () และ acos () จะถูกตัดทอนเป็นโดเมน± 1 เนื่องจากค่าใด ๆ ที่อยู่ภายนอกนั้นไม่มีความหมาย
ในการทดสอบฟังก์ชันการประมาณค่าหนึ่งพันล้านการประเมินฟังก์ชันแบบสุ่มถูกบังคับให้ต้องได้รับการประเมิน (นั่นคือคอมไพลเลอร์การเพิ่มประสิทธิภาพ -O3 ไม่ได้รับอนุญาตให้ข้ามการประเมินบางสิ่งบางอย่างเนื่องจากจะไม่ใช้ผลการคำนวณบางอย่าง) เพื่อลบอคติของการประเมินพันล้าน ตัวเลขสุ่มและการประมวลผลผลลัพธ์ต้นทุนของการรันโดยไม่ได้ประเมินฟังก์ชันตรีโกณมิติหรือฟังก์ชันตรีโกณมิติใด ๆ ก่อน จากนั้นอคตินี้จะถูกลบออกจากการทดสอบแต่ละครั้งเพื่อให้ได้ค่าประมาณที่เป็นตัวแทนมากขึ้นของเวลาในการประเมินฟังก์ชันจริง
ตารางที่ 2. เวลาที่ใช้เป็นวินาทีในการเรียกใช้ฟังก์ชันที่ระบุหรือฟังก์ชันหนึ่งพันล้านครั้ง ค่าประมาณได้มาจากการลบต้นทุนเวลาในการประเมินตัวเลขสุ่มหนึ่งพันล้านตัวเลขที่แสดงในแถวแรกของตารางที่ 1 จากแถวที่เหลือในตารางที่ 1
เวลาที่ใช้ในการฟอกหนัง (): 18.0515 18.2545
เวลาที่ใช้ใน TAN3 (): 5.93853 6.02349
เวลาที่ใช้ใน TAN4 (): 6.72216 6.99134
เวลาที่ใช้ในการทำ sin () และ cos (): 19.4052 19.4311
เวลาที่ใช้ใน SINCOS3 (): 7.85564 7.92844
เวลาที่ใช้ใน SINCOS4 (): 9.36672 9.57946
เวลาที่ใช้ใน atan (): 15.7160 15.6599
เวลาที่ใช้ใน ATAN1 (): 6.47800 6.55230
เวลาที่ใช้ใน ATAN2 (): 7.26730 7.24885
เวลาที่ใช้ใน ATAN3 (): 8.15299 8.21284
เวลาที่ใช้ใน asin () และ acos (): 36.8833 36.9496
เวลาที่ใช้ใน ASINCOS1 (): 10.1655 9.78479
เวลาที่ใช้ใน ASINCOS2 (): 10.6236 10.6000
เวลาที่ใช้ใน ASINCOS3 (): 12.8430 12.0707
(เพื่อประโยชน์ในการประหยัดพื้นที่ตารางที่ 1 จะไม่แสดง) ตารางที่ 2 แสดงผลลัพธ์ของการประเมินผลการประเมินเป็นพันล้านครั้งที่แยกจากกันสองครั้งของแต่ละฟังก์ชันโดยประมาณ คอลัมน์แรกคือการรันครั้งแรกและคอลัมน์ที่สองเป็นการรันครั้งที่สอง ตัวเลข '1', '2', '3' หรือ '4' ในชื่อฟังก์ชันระบุจำนวนคำศัพท์ที่ใช้ในฟังก์ชันชุด Maclaurin เพื่อประเมินการประมาณค่าตรีโกณมิติ SINCOS # () หมายความว่าทั้ง sin และ cos ได้รับการประเมินในเวลาเดียวกัน ในทำนองเดียวกัน ASINCOS # () หมายถึงทั้ง asin และ acos ได้รับการประเมินในเวลาเดียวกัน มีค่าใช้จ่ายเพิ่มเติมเล็กน้อยในการประเมินปริมาณทั้งสองในเวลาเดียวกัน
ผลลัพธ์แสดงให้เห็นว่าการเพิ่มจำนวนคำศัพท์เล็กน้อยช่วยเพิ่มเวลาในการดำเนินการตามที่คาดไว้ แม้แต่จำนวนคำที่น้อยที่สุดก็ให้ความแม่นยำประมาณ 12-14 หลักทุกที่ยกเว้นการประมาณสีแทน () ใกล้กับที่ค่าเข้าใกล้±อินฟินิตี้ ใคร ๆ ก็คาดหวังว่าฟังก์ชัน tan () จะมีปัญหา
ผลลัพธ์ที่คล้ายกันนี้ได้มาจากแล็ปท็อป MacBook Pro ระดับไฮเอนด์ใน Unix และบนคอมพิวเตอร์เดสก์ท็อประดับไฮเอนด์ใน Linux