Tôi muốn tính cả sin và đồng sin của một giá trị với nhau (ví dụ: để tạo ma trận xoay). Tất nhiên tôi có thể tính toán chúng riêng lẻ từng cái một a = cos(x); b = sin(x);, nhưng tôi tự hỏi liệu có cách nào nhanh hơn khi cần cả hai giá trị không.
Chỉnh sửa: Để tóm tắt các câu trả lời cho đến nay:
Vlad nói rằng có lệnh asm
FSINCOStính toán cả hai (gần như giống như một cuộc gọi đếnFSINmột mình)Giống như Chi nhận thấy, việc tối ưu hóa này đôi khi đã được trình biên dịch thực hiện (khi sử dụng cờ tối ưu hóa).
caf đã chỉ ra rằng các chức năng
sincosvàsincosfcó thể có sẵn và có thể được gọi trực tiếp bằng cách bao gồmmath.hPhương pháp tiếp cận tanascius của việc sử dụng bảng tra cứu được thảo luận gây tranh cãi. (Tuy nhiên, trên máy tính của tôi và trong một kịch bản điểm chuẩn, nó chạy nhanh hơn gấp 3 lần so
sincosvới với độ chính xác gần như tương tự đối với các dấu chấm động 32 bit.)Joel Goodwin đã liên kết với một cách tiếp cận thú vị của kỹ thuật xấp xỉ cực nhanh với ắc quy khá tốt (đối với tôi, điều này thậm chí còn nhanh hơn khi tra cứu bảng)
sinx ~ x-x^3/6và cosx~1-x^2/4dưới dạng gần đúng nếu bạn quan tâm đến tốc độ hơn độ chính xác. Bạn có thể thêm vào các thuật ngữ trong một trong hai chuỗi khi bạn đặt nặng hơn về độ chính xác ( en.wikipedia.org/wiki/Taylor_series cuộn xuống chuỗi trig taylor.) Lưu ý rằng đây là một cách chung để ước lượng bất kỳ hàm nào bạn muốn với nthời gian khác nhau. Vì vậy, nếu bạn có một số hàm lớn hơn mà sin và cosin đó thuộc về bạn, bạn sẽ nhận được tốc độ lớn hơn nhiều nếu bạn tính gần đúng nó thay vì sin, cos độc lập.
xgần một lúc nào đó x_0, sau đó mở rộng chuỗi Taylor của bạn xung quanh x_0thay vì 0. Điều này sẽ cung cấp cho bạn độ chính xác tuyệt vời gần x_0nhưng xa hơn bạn kết quả càng tồi tệ. Bạn có thể nghĩ rằng độ chính xác tệ gây ra khi bạn nhìn vào asnwer đã cho và thử nó cho các giá trị khác xa 0. Câu trả lời đó là với sin, cos mở rộng khoảng 0.