mathjs

mathjs

全面的JavaScript数学计算库 支持多种数据类型与符号运算

mathjs是一个功能丰富的JavaScript和Node.js数学库。它具备灵活的表达式解析器,支持符号计算,并内置大量函数和常量。该库可处理普通数字、大数、复数、分数、单位和矩阵等多种数据类型,适用于浏览器和服务器端环境。mathjs易于使用和扩展,是进行各类数学运算的有力工具。

Math.js数学库JavaScriptNode.js表达式解析Github开源项目

math.js

https://mathjs.org

Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices. Powerful and easy to use.

Version Downloads Build Status Maintenance License FOSSA Status Codecov Github Sponsor

Features

  • Supports numbers, bignumbers, bigints, complex numbers, fractions, units, strings, arrays, and matrices.
  • Is compatible with JavaScript's built-in Math library.
  • Contains a flexible expression parser.
  • Does symbolic computation.
  • Comes with a large set of built-in functions and constants.
  • Can be used as a command line application as well.
  • Runs on any JavaScript engine.
  • Is easily extensible.
  • Open source.

Usage

Math.js can be used in both node.js and in the browser.

Install math.js using npm:

npm install mathjs

Or download mathjs via one of the CDN's listed on the downloads page:

    https://mathjs.org/download.html

Math.js can be used similar to JavaScript's built-in Math library. Besides that, math.js can evaluate expressions and supports 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

See the Getting Started for a more detailed tutorial.

Browser support

Math.js works on any ES2020 compatible JavaScript engine, including node.js, Chrome, Firefox, Safari, and Edge.

Documentation

Build

First clone the project from github:

git clone git@github.com:josdejong/mathjs.git
cd mathjs

Install the project dependencies:

npm install

Then, the project can be build by executing the build script via npm:

npm run build

This will build ESM output, CommonJS output, and the bundle math.js from the source files and put them in the folder lib.

Develop

When developing new features for mathjs, it is good to be aware of the following background information.

Code

The code of mathjs is written in ES modules, and requires all files to have a real, relative path, meaning the files must have a *.js extension. Please configure adding file extensions on auto import in your IDE.

Architecture

What mathjs tries to achieve is to offer an environment where you can do calculations with mixed data types, like multiplying a regular number with a Complex number or a BigNumber, and work with all of those in matrices. Mathjs also allows to add a new data type with little effort.

The solution that mathjs uses has two main ingredients:

  • Typed functions. All functions are created using typed-function. This makes it easier to (dynamically) create and extend a single function with new data types, automatically do type conversions on function inputs, etc. So, if you create function multiply for two numbers, you can extend it with support for multiplying your own data type, say MyDecimal. If you define a conversion from MyDecimal to number, the typed-function will automatically allow you to multiply a MyDecimal with a number.

  • Dependency injection. When we have a function multiply with support for MyDecimal, thanks to the dependency injection, other functions using multiply under the hood, like prod, will automatically support MyDecimal too. This also works the other way around: if you don't need the heavyweight multiply (which supports BigNumbers, matrices, etc), and you just need a plain and simple number support, you can use a lightweight implementation of multiply just for numbers, and inject that in prod and other functions.

At the lowest level, mathjs has immutable factory functions which create immutable functions. The core function math.create(...) creates a new instance having functions created from all passed factory functions. A mathjs instance is a collection of created functions. It contains a function like math.import to allow extending the instance with new functions, which can then be used in the expression parser.

Implementing a new function

A common case is to implement a new function. This involves the following steps:

  • Implement the function in the right category, for example ./src/function/arithmetic/myNewFunction.js, where you can replace arithmetic with the proper category, and myNewFunction with the name of the new function. Add the new function to the index files ./src/factoriesAny.js and possibly ./src/factoriesNumber.js.
  • Write documentation on the function in the source code comment of myNewFunction.js. This documentation is used to auto generate documentation on the website.
  • Write embedded documentation for the new function in ./src/expression/embeddedDocs/function/arithmetic/myNewFunction.js. Add the new documentation to the index file ./src/expression/embeddedDocs/embeddedDocs.js.
  • Write unit tests for the function in ./test/unit-tests/function/arithmetic/myNewFunction.test.js.
  • Write the necessary TypeScript definitions for the new function in ./types/index.d.ts, and write tests for it in ./test/typescript-tests/testTypes.ts. This is described in ./types/EXPLANATION.md.
  • Ensure the code style is ok by running npm run lint (run npm run format to fix the code style automatically).

Build scripts

The build script currently generates two types of output:

  • any, generate entry points to create full versions of all functions
  • number: generating and entry points to create lightweight functions just supporting number

For each function, an object is generated containing the factory functions of all dependencies of the function. This allows to just load a specific set of functions, and not load or bundle any other functionality. So for example, to just create function add you can do math.create(addDependencies).

Test

To execute tests for the library, install the project dependencies once:

npm install

Then, the tests can be executed:

npm test

To test the type definitions:

npm run test:types

Additionally, the tests can be run on FireFox using headless mode:

npm run test:browser

To run the tests remotely on BrowserStack, first set the environment variables BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY with your username and access key and then execute:

npm run test:browserstack

You can separately run the code linter, though it is also executed with npm test:

npm run lint

To automatically fix linting issue, run:

npm run format

To test code coverage of the tests:

npm run coverage

To see the coverage results, open the generated report in your browser:

./coverage/lcov-report/index.html

Continuous integration testing

Continuous integration tests are run on Github Actions and BrowserStack every time a commit is pushed to github. Github Actions runs the tests for different versions of node.js, and BrowserStack runs the tests on all major browsers.

BrowserStack

Thanks Github Actions and BrowserStack for the generous free hosting of this open source project!

License

mathjs is published under the Apache 2.0 license:

Copyright (C) 2013-2024 Jos de Jong <wjosdejong@gmail.com>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

mathjs contains a JavaScript port of the CSparse library, published under the LGPL-2.1+ license:

CSparse: a Concise Sparse matrix package.
Copyright (c) 2006, Timothy A. Davis.
http://www.suitesparse.com

--------------------------------------------------------------------------------

CSparse is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

CSparse is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this Module; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多