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
FSINCOS
tính toán cả hai (gần như giống như một cuộc gọi đếnFSIN
mộ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
sincos
vàsincosf
có thể có sẵn và có thể được gọi trực tiếp bằng cách bao gồmmath.h
Phươ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
sincos
vớ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/6
và cosx~1-x^2/4
dướ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 n
thờ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.
x
gần một lúc nào đó x_0
, sau đó mở rộng chuỗi Taylor của bạn xung quanh x_0
thay vì 0. Điều này sẽ cung cấp cho bạn độ chính xác tuyệt vời gần x_0
như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.