Tôi muốn mở rộng câu trả lời được cung cấp bởi @Jason S. Sử dụng phương pháp chia nhỏ miền tương tự như phương pháp được mô tả bởi @Jason S và sử dụng xấp xỉ chuỗi Maclaurin, tốc độ trung bình (2-3) X so với tan (), sin () Các hàm, cos (), atan (), asin () và acos () được tích hợp trong trình biên dịch gcc với tối ưu hóa -O3 đã đạt được. Các hàm xấp xỉ dòng Maclaurin tốt nhất được mô tả bên dưới đạt được độ chính xác gấp đôi.
Đối với các hàm tan (), sin () và cos () và để đơn giản, miền chồng chéo từ 0 đến 2pi + pi / 80 được chia thành 81 khoảng bằng nhau với "điểm neo" tại pi / 80, 3pi / 80, ..., 161pi / 80. Sau đó tan (), sin () và cos () của 81 điểm neo này được đánh giá và lưu trữ. Với sự trợ giúp của nhận dạng trig, một hàm chuỗi Maclaurin duy nhất đã được phát triển cho mỗi hàm trig. Bất kỳ góc nào giữa ± vô cực đều có thể được đưa vào các hàm xấp xỉ trig vì trước tiên các hàm dịch góc đầu vào sang miền 0 đến 2pi. Chi phí dịch thuật này được bao gồm trong chi phí ước tính.
Các phương pháp tương tự đã được phát triển cho các hàm atan (), asin () và acos (), trong đó miền chồng chéo -1.0 đến 1.1 được chia thành 21 khoảng bằng nhau với các điểm neo ở -19/20, -17/20, .. ., 19/20, 21/20. Sau đó, chỉ atan () trong số 21 điểm neo này được lưu trữ. Một lần nữa, với sự trợ giúp của các nhận dạng trig nghịch đảo, một hàm chuỗi Maclaurin duy nhất đã được phát triển cho hàm atan (). Kết quả của hàm atan () sau đó được sử dụng để tính gần đúng asin () và acos ().
Vì tất cả các hàm xấp xỉ trig nghịch đảo đều dựa trên hàm xấp xỉ atan (), mọi giá trị đầu vào đối số có độ chính xác kép đều được phép. Tuy nhiên, đầu vào đối số cho các hàm xấp xỉ asin () và acos () bị cắt ngắn thành miền ± 1 vì bất kỳ giá trị nào bên ngoài nó đều vô nghĩa.
Để kiểm tra các hàm gần đúng, một tỷ đánh giá hàm ngẫu nhiên buộc phải được đánh giá (nghĩa là, trình biên dịch tối ưu hóa -O3 không được phép bỏ qua đánh giá thứ gì đó vì một số kết quả tính toán sẽ không được sử dụng.) Để loại bỏ sai lệch khi đánh giá một tỷ số ngẫu nhiên và xử lý kết quả, chi phí của một lần chạy mà không đánh giá bất kỳ hàm trig hoặc nghịch đảo nào được thực hiện trước. Độ chệch này sau đó được trừ đi trong mỗi phép thử để thu được giá trị xấp xỉ đại diện hơn cho thời gian đánh giá hàm thực tế.
Bảng 2. Thời gian tính bằng giây để thực hiện chức năng được chỉ định hoặc các chức năng một tỷ lần. Các ước tính thu được bằng cách trừ đi chi phí thời gian để đánh giá một tỷ số ngẫu nhiên được hiển thị trong hàng đầu tiên của Bảng 1 với các hàng còn lại trong Bảng 1.
Thời gian ở tan (): 18.0515 18.2545
Thời gian ở TAN3 (): 5.93853 6.02349
Thời gian ở TAN4 (): 6.72216 6.99134
Thời gian dành cho sin () và cos (): 19.4052 19.4311
Thời gian dành cho SINCOS3 (): 7.85564 7.92844
Thời gian dành cho SINCOS4 (): 9.36672 9.57946
Thời gian sử dụng atan (): 15,7160 15,6599
Thời gian sử dụng ATAN1 (): 6.47800 6.55230
Thời gian sử dụng ATAN2 (): 7.26730 7.24885
Thời gian sử dụng ATAN3 (): 8.15299 8.21284
Thời gian sử dụng asin () và acos (): 36,8833 36,9496
Thời gian dành cho ASINCOS1 (): 10.1655 9.78479
Thời gian dành cho ASINCOS2 (): 10.6236 10.6000
Thời gian dành cho ASINCOS3 (): 12.8430 12.0707
(Vì lợi ích của việc tiết kiệm không gian, Bảng 1 không được hiển thị.) Bảng 2 cho thấy kết quả của hai lần chạy riêng biệt của một tỷ đánh giá của mỗi hàm gần đúng. Cột đầu tiên là lần chạy đầu tiên và cột thứ hai là lần chạy thứ hai. Các số '1', '2', '3' hoặc '4' trong tên hàm cho biết số thuật ngữ được sử dụng trong hàm chuỗi Maclaurin để đánh giá xấp xỉ trig cụ thể hoặc nghịch đảo. SINCOS # () có nghĩa là cả sin và cos đều được đánh giá cùng một lúc. Tương tự như vậy, ASINCOS # () có nghĩa là cả asin và acos đều được đánh giá cùng một lúc. Có rất ít chi phí bổ sung trong việc đánh giá cả hai đại lượng cùng một lúc.
Kết quả cho thấy rằng việc tăng số lượng điều khoản sẽ làm tăng nhẹ thời gian thực hiện như mong đợi. Ngay cả số thuật ngữ nhỏ nhất cũng cho độ chính xác khoảng 12-14 chữ số ở mọi nơi ngoại trừ xấp xỉ tan () gần nơi giá trị của nó tiến tới ± vô cùng. Người ta có thể mong đợi ngay cả hàm tan () cũng có vấn đề ở đó.
Kết quả tương tự cũng thu được trên máy tính xách tay MacBook Pro cao cấp trong Unix và trên máy tính để bàn cao cấp chạy Linux.