2010-01-30 46 views
26

Tôi đang tìm cách gửi bản vá cho thư viện chuẩn ngôn ngữ lập trình D sẽ cho phép đánh giá nhiều std.math tại thời gian biên dịch bằng cách sử dụng các tiện ích đánh giá chức năng biên dịch của ngôn ngữ. Đánh giá chức năng biên dịch thời gian có một số giới hạn, những điều quan trọng nhất là:Nơi tìm các thuật toán cho các hàm toán học chuẩn?

  1. Bạn không thể sử dụng ngôn ngữ lắp ráp.
  2. Bạn không thể gọi mã C hoặc mã mà nguồn không khả dụng.

Một số chức năng std.math vi phạm các phiên bản biên dịch và thời gian cần phải được viết. Tôi có thể lấy thông tin về thuật toán tốt ở đâu để tính toán những thứ như logarit, lũy thừa, quyền hạn và chức năng trig? Tôi thích giới thiệu mức chỉ cao các thuật toán để mã thực tế, vì hai lý do:

  1. Để tránh sự mơ hồ về pháp lý và sự cần thiết phải làm cho cái nhìn mã của tôi "khác nhau, đủ" từ nguồn đến chắc chắn rằng tôi sở hữu bản quyền.

  2. Tôi muốn các thuật toán đơn giản, di động. Tôi không quan tâm đến tối ưu hóa vi mô miễn là chúng tối thiểu hiệu quả tiệm cận.

Edit: D's mô hình đánh giá chức năng thời gian biên dịch cho phép kết quả điểm tính tại thời gian biên dịch khác với những tính toán trong thời gian chạy dù sao đi nữa nổi, vì vậy tôi không quan tâm nếu thuật toán thời gian biên dịch của tôi không cho chính xác cùng một kết quả như phiên bản thời gian chạy miễn là chúng không kém chính xác đến mức độ thực tế đáng kể.

Trả lời

3

Xem sách "Elementary Functions: Algorithms and Implementation" bởi Jean-Michel Muller.

+0

hmmm - có vẻ tốt về lý thuyết chung về xấp xỉ hàm. nhưng đọc bảng mục lục, chúng dường như không đi qua các chức năng cụ thể. hầu hết các hàm, nếu được đánh giá trên một phạm vi hữu hạn, không khó tính toán. Nhưng trên phạm vi đầy đủ của các đầu vào 'double', exp() và log() và sqrt() không tầm thường để thực hiện. (sin/cos/tan có thể sử dụng giảm phạm vi) Sau đó, bạn nhận được vào erf và gamma và bessel chức năng và các công cụ khác. –

2

Có lẽ đây sẽ giúp bạn (ít nhất là đối với một số chức năng): http://en.wikipedia.org/wiki/CORDIC

+2

CORDIC không thích hợp cho các thuật toán cấp cao, nó là nhiều hơn cho các hệ thống nhúng/kỹ thuật số, nơi phép nhân là tốn kém. –

+0

Vâng, tôi sẽ không nói CORDIC là không thích hợp. Có, có thể có các thuật toán nhanh hơn, nếu phép nhân rẻ (như bài viết wikipedia cũng chỉ ra). dsimcha đã yêu cầu các thuật toán "đơn giản" và không "quan tâm đến tối ưu hóa vi mô". – Curd

4

Nguồn mà tôi đề xuất là Phương pháp số cho các nhà khoa học và kỹ sư bởi R. W. Hamming.

Sách này được xuất bản bởi Dover Press và là một bìa mềm rẻ tiền.

8

Sách của Jean-Michel Muller là một đề xuất tuyệt vời, cũng như Hart.

Bạn có thực sự cần thiết để sở hữu bản quyền không? Nó thường là một ý tưởng tồi để có được vào kinh doanh của các chức năng viết thư viện toán học nếu bạn có thể tránh nó (và tôi nói rằng như là một người làm như vậy chuyên nghiệp). Tôi không biết liệu D có thể nhận mã BSD được cấp phép hay không, nhưng có một số triển khai mã nguồn mở tốt có thể hữu ích. Bạn có thể muốn xem số FDLIBM của Sun.Stephen Moshier Cephes cũng sẽ là một khả năng, mặc dù tình trạng cấp phép của nó hơi kỳ quặc, nhưng tôi tin rằng anh ta sẵn sàng để mọi người phân phối lại mã của mình theo các giấy phép khác trong quá khứ.

Trên một lưu ý phụ, trừ khi bạn đang hỗ trợ dấu phẩy động chính xác tùy ý (tôi không nghĩ D đó), thường không có khái niệm "hiệu quả tiệm cận" cho các hàm libm.

17

John Hart Máy tính xấp xỉ 1968 bởi John Wiley & Sons.

Các phép tính lý tưởng phải khớp chính xác với những gì chúng sẽ thực hiện khi chạy. Điều đó có thể phức tạp. Đối với nhiều chức năng, không có chuỗi hội tụ nhanh chóng trên toàn miền, vì vậy các thuật toán kết hợp các phương thức khác nhau.

Ngoài ra, có nhiều định dạng điểm nổi khác nhau. Hầu hết các nền tảng (tôi nghĩ) bây giờ sử dụng IEEE 754. Khi tôi viết một trình biên dịch ca. 1985, tôi phải giải quyết các định dạng điểm nổi đa nền tảng. Nó đã rất tẻ nhạt để làm cho nó đúng, bởi vì bạn phải mảnh những con số với nhau từng chút một, chắc chắn rằng bạn nhận được chính xác giá trị sẽ được tính toán trên máy mục tiêu. Tôi không biết nếu bạn phải đối phó với điều đó.

+3

+1 cho nhận xét rằng thời gian biên dịch phải khớp với thời gian chạy. Một cái gì đó mà các nhà văn biên dịch là quá nhanh để quên. Tôi sẽ cho nó 20 upvotes nếu tôi có thể. Trên một lưu ý ít tích cực hơn, bạn có nghĩa là IEEE - ** 754 **. 488 là tiêu chuẩn cho bus giao diện HP, iirc. –

+1

Cảm ơn. Tôi sẽ chỉnh sửa bình luận. IEEE 488 là một loại động vật hoàn toàn khác. –

+1

+1 để viết trình biên dịch bạn cũ hack :) – ldog

1

Xem Stand-alone code for numerical computing để liên kết mã cho một số chức năng đặc biệt và để tạo số ngẫu nhiên. Tất cả các mã có tên miền công cộng. Mã được thực hiện bằng C++ và Python, nhưng thật dễ dàng dịch sang bất kỳ ngôn ngữ nào khác.

4

Như bạn mong muốn, vấn đề tương tự xảy ra trong các ngôn ngữ khác:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StrictMath.html

Để giúp đảm bảo tính di động của Java chương trình, các định nghĩa của một số các chức năng số trong gói này yêu cầu chúng tạo ra cùng một kết quả như một số thuật toán được xuất bản nhất định được xuất bản . Các thuật toán này là có sẵn từ mạng lưới thư viện nổi tiếng như gói "Tự do Thư viện toán phân phối", fdlibm. Các thuật toán này, được viết bằng ngôn ngữ lập trình C, sau đó là để được hiểu là được thực hiện với tất cả các hoạt động điểm động sau quy tắc của điểm nổi Java số học.

Tôi không biết quy tắc D là gì để tính toán thời gian chạy các hàm toán học, nhưng bạn có thể rút một mẹo tương tự - diễn giải lại nguồn C của fdlibm thành D. Nếu D gọi nền tảng cụ thể C thư viện, sau đó bạn có vấn đề mà nó có thể là không thể tại thời gian biên dịch để dự đoán giá trị thời gian chạy.

Tôi nghĩ giấy phép của fdlibm rất dễ chấp nhận, bạn phải tự mình kiểm tra xem nó có phù hợp để phân phối lại trong D. Một phiên bản mà tôi đã thấy yêu cầu phải có thông báo bản quyền, và đó là nó.

Các vấn đề liên quan