Mathjs
Math.js là một thư viện toán học mở rộng cho JavaScript và Node.js. Nó có một bộ phân tích biểu thức linh hoạt hỗ trợ tính toán biểu hiện, đi kèm với một tập hợp lớn các hàm và hằng số tích hợp sẵn, và cung cấp một giải pháp tích hợp để làm việc với các loại dữ liệu khác nhau như số, số lớn, số phức, phân số, đơn vị và ma trận. Mạnh mẽ và dễ sử dụng.
Tính năng
- Hỗ trợ số, số lớn, số phức, phân số, đơn vị, chuỗi, mảng và ma trận.
- Tương thích với thư viện toán học tích hợp sẵn của JavaScript.
- Chứa một bộ phân tích biểu thức linh hoạt.
- Tính toán biểu hiện.
- Đi kèm với một tập hợp lớn các hàm và hằng số tích hợp sẵn.
- Có thể sử dụng như một ứng dụng dòng lệnh.
- Chạy trên bất kỳ máy chủ JavaScript nào.
- Dễ mở rộng.
- Mã nguồn mở.
Sử dụng
Math.js có thể sử dụng cả trong node.js và trình duyệt.
Cài đặt math.js bằng cách sử dụng npm:
npm install mathjs
Hoặc tải xuống mathjs thông qua một trong các CDN được liệt kê trên trang tải xuống:
https://mathjs.org/download.html
Math.js có thể sử dụng tương tự như thư viện toán học tích hợp sẵn của JavaScript. Bên cạnh đó, math.js có thể đánh giá expressions và hỗ trợ chained operations.
import {
atan2, chain, derivative, e, evaluate, log, pi, pow, round, sqrt
} from 'mathjs'
// functions and constants
round(e, 3) // 2.718
atan2(3, -3) / pi // 0.75
log(10000, 10) // 4
sqrt(-4) // 2i
pow([[-1, 2], [3, 1]], 2) // [[7, 0], [0, 7]]
derivative('x^2 + x', 'x') // 2 * x + 1
// expressions
evaluate('12 / (2.3 + 0.7)') // 4
evaluate('12.7 cm to inch') // 5 inch
evaluate('sin(45 deg) ^ 2') // 0.5
evaluate('9 / 3 + 2i') // 3 + 2i
evaluate('det([-1, 2; 3, 1])') // -7
// chaining
chain(3)
.add(4)
.multiply(2)
.done() // 14
Xem Getting Started để biết hướng dẫn chi tiết hơn.
Hỗ trợ trình duyệt
Math.js hoạt động trên bất kỳ máy chủ JavaScript tương thích ES6 nào, bao gồm node.js, Chrome, Firefox, Safari và Edge.
Tài liệu
Xây dựng
Đầu tiên, sao chép dự án từ github:
git clone git@github.com:josdejong/mathjs.git
cd mathjs
Cài đặt các phụ thuộc dự án:
npm install
Sau đó, dự án có thể được xây dựng bằng cách thực thi tập lệnh xây dựng thông qua npm:
npm run build
Điều này sẽ xây dựng đầu ra ESM, đầu ra CommonJS và bundle math.js từ các tệp nguồn và đặt chúng trong thư mục lib.
Phát triển
Khi phát triển các tính năng mới cho mathjs, việc nắm vững thông tin nền sau đây là quan trọng.
Mã nguồn
Mã nguồn của mathjs
được viết dưới dạng ES modules và yêu cầu tất cả các tệp phải có một đường dẫn thực sự, tương đối, có nghĩa là các tệp phải có phần mở rộng *.js
. Vui lòng cấu hình thêm phần mở rộng tệp khi tự động nhập trong IDE của bạn.
Kiến trúc
Điều mathjs cố gắng đạt được là cung cấp môi trường cho bạn thực hiện tính toán với các loại dữ liệu kết hợp, như nhân một number
thông thường với một số phức Complex
hoặc BigNumber
, và làm việc với tất cả chúng trong ma trận. Mathjs cũng cho phép thêm một loại dữ liệu mới, ví dụ như BigInt
, một cách dễ dàng.
Giải pháp mà mathjs sử dụng có hai thành phần chính:
Hàm có kiểu dữ liệu. Tất cả các hàm được tạo bằng cách sử dụng typed-function. Điều này làm cho việc (động) tạo và mở rộng một hàm duy nhất với các loại dữ liệu mới dễ dàng hơn, tự động thực hiện chuyển đổi kiểu trên đầu vào hàm, v.v. Vì vậy, nếu bạn tạo hàm nhân cho hai number
, bạn có thể mở rộng nó để hỗ trợ việc nhân hai BigInts
. Nếu bạn định nghĩa một chuyển đổi từ BigInt
sang number
, hàm có kiểu dữ liệu sẽ tự động cho phép bạn nhân một BigInt
với một number
.
Dependency injection. Khi chúng ta có một hàm nhân
hỗ trợ BigInt
, nhờ vào việc tiêm (inject) phụ thuộc, các hàm khác sử dụng nhân
bên trong, như tích
, sẽ tự động hỗ trợ BigInt
cũng. Điều này cũng hoạt động theo cách ngược lại: nếu bạn không cần hàm nhân
nặng nề (hỗ trợ BigNumbers, ma trận, v.v.), và bạn chỉ cần hỗ trợ số đơn giản, bạn có thể sử dụng một phiên bản nhẹ của nhân
chỉ cho số và tiêm (inject) nó vào tích
và các hàm khác.
Ở cấp độ thấp nhất, mathjs có các hàm tạo không thay đổi (immutable) để tạo ra các hàm không thay đổi. Hàm cốt lõi math.create(...)
tạo một phiên bản mới có các hàm được tạo ra từ tất cả các hàm tạo (factory functions) được truyền vào. Một phiên bản mathjs là một bộ sưu tập các hàm được tạo ra. Nó chứa một hàm như math.import
để cho phép mở rộng phiên bản với các hàm mới, sau đó có thể được sử dụng trong trình phân tích biểu thức.
Thực hiện một hàm mới
Một trường hợp phổ biến là thực hiện một hàm mới. Điều này bao gồm các bước sau:
- Thực hiện hàm trong danh mục phù hợp, ví dụ
./src/function/arithmetic/myNewFunction.js
, trong đó bạn có thể thay thếarithmetic
bằng danh mục thích hợp vàmyNewFunction
bằng tên của hàm mới. Thêm hàm mới vào tệp chỉ mục./src/factoriesAny.js
và có thể là./src/factoriesNumber.js
. - Viết tài liệu về hàm trong phần bình luận mã nguồn của
myNewFunction.js
. Tài liệu này được sử dụng để tự động tạo tài liệu trên trang web. - Viết tài liệu nhúng cho hàm mới trong
./src/expression/embeddedDocs/function/arithmetic/myNewFunction.js
. Thêm tài liệu mới vào tệp chỉ mục./src/expression/embeddedDocs/embeddedDocs.js
. - Viết kiểm tra đơn vị cho hàm trong
./test/unit-tests/function/arithmetic/myNewFunction.test.js
. - Viết một định nghĩa TypeScript cho hàm mới trong
./types/index.d.ts
, và viết kiểm tra cho nó trong./types/index.ts
. Thông thường, cần thêm hai định nghĩa: một cho hàm tĩnhmath.myNewFunction(...)
và một cho API chuỗimath.chain(...).myNewFunction(...)
. - Đảm bảo kiểu mã nguồn là ổn bằng cách chạy
npm run lint
(chạynpm run format
để tự động sửa kiểu mã nguồn).
Tập lệnh xây dựng
Tập lệnh xây dựng hiện tạo ra hai loại đầu ra:
- any , tạo các điểm nhập để tạo ra phiên bản đầy đủ của tất cả các hàm
- number : tạo và điểm nhập để tạo ra các hàm nhẹ chỉ hỗ trợ
number
Đối với mỗi hàm, một đối tượng được tạo ra chứa các hàm tạo của tất cả các phụ thuộc của hàm đó. Điều này cho phép chỉ nạp một tập hàm cụ thể và không nạp hoặc đóng gói bất kỳ chức năng nào khác. Ví dụ, để chỉ tạo hàm cộng
bạn có thể làm math.create(addDependencies)
.
Kiểm tra
Để thực hiện các kiểm tra cho thư viện, hãy cài đặt các phụ thuộc của dự án một lần:
npm install
Sau đó, bạn có thể thực hiện các kiểm tra:
npm test
Ngoài ra, bạn có thể chạy các kiểm tra trên FireFox bằng cách sử dụng headless mode:
npm run test:browser
Để chạy các kiểm tra từ xa trên BrowserStack, trước tiên đặt các biến môi trường BROWSER_STACK_USERNAME
và BROWSER_STACK_ACCESS_KEY
với tên người dùng và khóa truy cập của bạn, sau đó thực hiện:
npm run test:browserstack
Bạn có thể chạy riêng lẻ linter mã nguồn, mặc dù nó cũng được thực hiện bằng npm test
:
npm run lint
Để tự động sửa các vấn đề liên quan đến linter, chạy:
npm run format
Để kiểm tra phạm vi mã nguồn của các kiểm tra:
npm run coverage
Để xem kết quả phạm vi mã nguồn, mở báo cáo được tạo ra trong trình duyệt của bạn:
./coverage/lcov-report/index.html
Kiểm tra tích hợp liên tục
Kiểm tra tích hợp liên tục được thực hiện trên Github Actions và BrowserStack mỗi khi có một commit được đẩy lên github. Github Actions chạy các kiểm tra cho các phiên bản khác nhau của node.js, và BrowserStack chạy các kiểm tra trên tất cả các trình duyệt chính.
Cảm ơn Github Actions và BrowserStack đã hỗ trợ miễn phí rộng lớn cho dự án mã nguồn mở này!
Chi tiết Tải về:
Tác giả: josdejong
Mã nguồn: https://github.com/josdejong/mathjs
Giấy phép: Apache-2.0 license