Menu

The language

Calcpad uses a simple programming language that includes the following elements:
- Real numbers: digits 0 - 9 and decimal point ".";
- Complex numbers: re ± imi (e.g. 3 - 2i);
- Vectors: [v₁; v₂; v₃; …; vₙ];
- Matrices: [M₁₁; M₁₂; … ; M₁ₙ | M₂₁; M₂₂; … ; M₂ₙ | … | Mₘ₁; Mₘ₂; … ; Mₘₙ]
- Variables:
  - all Unicode letters;
  - digits: 0 - 9;
  - comma: " , ";
  - special symbols: ′ , ″ , ‴ , ⁗ , ‾ , ø , Ø , ° , ∡ ;
  - superscripts: ⁰ , ¹ , ² , ³ , ⁴ , ⁵ , ⁶ , ⁷ , ⁸ , ⁹ , ⁿ , ⁺ , ⁻ ;
  - subscripts: ₀ , ₁ , ₂ , ₃ , ₄ , ₅ , ₆ , ₇ , ₈ , ₉ , ₊ , ₋ , ₌ , ₍ , ₎;
  - " _ " for subscript;
Any variable name must start with a letter. Names are case sensitive.
- Operators:
  "!" - factorial;
  "^" - exponent;
  "/" - division;
  "÷" - force division bar;
  "\" - integer division;
  "" - modulo (remainder);
  "*" - multiplication;
  "-" - minus;
  "+" - plus;
  "" - equal to;
  "" - not equal to;
  "<" - less than;
  ">" - greater than;
  "" - less or equal;
  "" - greater or equal;
  "" - logical "AND";
  "" - logical "OR";
  "" - logical "XOR";
  "" - phasor A∠φ (<<);
  "=" - assignment;
- Custom functions of type f (x; y; z; ... );
- Built-in functions:
  Trigonometric:
    sin(x) - sine;
    cos(x) - cosine;
    tan(x) - tangent;
    csc(x) - cosecant;
    sec(x) - secant;
    cot(x) - cotangent;
  Hyperbolic:
    sinh(x) - hyperbolic sine;
    cosh(x) - hyperbolic cosine;
    tanh(x) - hyperbolic tangent;
    csch(x) - hyperbolic cosecant;
    sech(x) - hyperbolic secant;
    coth(x) - hyperbolic cotangent;
  Inverse trigonometric:
    asin(x) - inverse sine;
    acos(x) - inverse cosine;
    atan(x) - inverse tangent;
    atan2(x; y) - the angle whose tangent is the quotient of y and x;
    acsc(x) - inverse cosecant;
    asec(x) - inverse secant;
    acot(x) - inverse cotangent;
  Inverse hyperbolic:
    asinh(x) - inverse hyperbolic sine;
    acosh(x) - inverse hyperbolic cosine;
    atanh(x) - inverse hyperbolic tangent;
    acsch(x) - inverse hyperbolic cosecant;
    asech(x) - inverse hyperbolic secant;
    acoth(x) - inverse hyperbolic cotangent;
  Logarithmic, exponential and roots:
    log(x) - decimal logarithm;
    ln(x) - natural logarithm;
    log_2(x) - binary logarithm;
    exp(x) - natural exponent;
    sqr(x) / sqrt(x) - square root;
    cbrt(x) - cubic root;
    root(x; n) - n-th root;
  Rounding:
    round(x) - round to the nearest integer;
    floor(x) - round to the smaller integer (towards -∞);
    ceiling(x) - round to the greater integer (towards +∞);
    trunc(x) - round to the smaller integer (towards zero);
  Integer:
    mod(x; y) - the remainder of an integer division;
    gcd(x; y; z...) - the greatest common divisor of several integers;
    lcm(x; y; z...) - the least common multiple of several integers;
  Complex:
    re(z) - the real part of a complex number;
    im(z) - the imaginary part of a complex number;
    abs(z) - absolute value/magnitude;
    phase(z) - the phase of a complex number;
    conj(z) - the conjugate of a complex number;
  Aggregate and interpolation:
    min(x; y; z...) - minimum of multiple values;
    max(x; y; z...) - maximum of multiple values;
    sum(x; y; z...) - sum of multiple values = x + y + z...;
    sumsq(x; y; z...) - sum of squares = x² + y² + z²...;
    srss(x; y; z...) - square root of sum of squares = sqrt(x² + y² + z²...);
    average(x; y; z...) - average of multiple values = (x + y + z...)/n;
    product(x; y; z...) - product of multiple values = x·y·z...;
    mean(x; y; z...) - geometric mean = n-th root(x·y·z...);
    take(n; a; b; c...) - returns the n-th element from the list;
    line(x; a; b; c...) - linear interpolation;
    spline(x; a; b; c...) - Hermite spline interpolation;
  Conditional and logical:
    if(cond; value-if-true; value-if-false) - conditional evaluation;
    switch(cond1; value1; cond2; value2; … ; default) - selective evaluation;
    not(x) - logical "NOT";
    and(x; y; z...) - logical "AND";
    or(x; y; z...) - logical "OR";
    xor(x; y; z...) - logical "XOR";
  Other:
    sign(x) - the sign of a number;
    random(x) - random number between 0 and x;
    getunits(x) - gets the units of x without the value. Returns 1 if x is unitless;
    setunits(x; u) - sets the units u to x where x can be scalar, vector or matrix;
    clrunits(x) - clears the units from a scalar, vector or matrix x;
    hp(x) - converts x to its high performance (hp) equivalent type;
    ishp(x) - checks if the type of x is a high-performance (hp) vector or matrix;
  Vector:
    Creational:
    vector(n) - creates an empty vector with length n;
    vector_hp(n) - creates an empty high performance (hp) vector with length n;
    fill(v; x) - fills vector v with value x;
    range(x1; xn; s) - creates a vector with values spanning from x1 to xn with step s;
    range_hp(x1; xn; s) - creates a high performance (hp) from a range of values as above;
    Structural:
    len(v) - returns the length of vector v;
    size(v) - the actual size of vector v - the index of the last non-zero element;
    resize(v; n) - sets a new length n of vector v;
    join(A; b; c…) - creates a vector by joining the arguments: matrices, vectors and scalars;
    slice(v; i₁; i₂) - returns the part of vector v bounded by indexes i₁ and i₂ inclusive;
    first(v; n) - the first n elements of vector v;
    last(v; n) - the last n elements of vector v;
    extract(v; i) - extracts the elements from v which indexes are contained in i;
    Data:
    sort(v) - sorts the elements of vector v in ascending order;
    rsort(v) - sorts the elements of vector v in descending order;
    order(v) - the indexes of vector v, arranged by the ascending order of its elements;
    revorder(v) - the indexes of vector v, arranged by the descending order of its elements;
    reverse(v) - a new vector containing the elements of v in reverse order;
    count(v; x; i) - the number of elements in v, after the i-th one, that are equal to x;
    search(v; x; i)- the index of the first element in v, after the i-th one, that is equal to x;
    find(v; x; i) or
    find_eq(v; x; i) - the indexes of all elements in v, after the i-th one, that are = x;
    find_ne(v; x; i) - the indexes of all elements in v, after the i-th one, that are ≠ x;
    find_lt(v; x; i) - the indexes of all elements in v, after the i-th one, that are < x;
    find_le(v; x; i) - the indexes of all elements in v, after the i-th one, that are ≤ x;
    find_gt(v; x; i) - the indexes of all elements in v, after the i-th one, that are > x;
    find_ge(v; x; i) - the indexes of all elements in v, after the i-th one, that are ≥ x;
    lookup(a; b; x) or
    lookup_eq(a; b; x) - all elements in a for which the respective elements in b are = x;
    lookup_ne(a; b; x) - all elements in a for which the respective elements in b are ≠ x;
    lookup_lt(a; b; x) - all elements in a for which the respective elements in b are < x;
    lookup_le(a; b; x) - all elements in a for which the respective elements in b are ≤ x;
    lookup_gt(a; b; x) - all elements in a for which the respective elements in b are > x;
    lookup_ge(a; b; x) - all elements in a for which the respective elements in b are ≥ x;
    Math:
    norm_1(v) - L1 (Manhattan) norm of vector v;
    norm(v) or
    norm_2(v) or
    norm_e(v) - L2 (Euclidean) norm of vector v;
    norm_p(v; p) - Lp norm of vector v;
    norm_i(v) - L∞ (infinity) norm of vector v;
    unit(v) - the normalized vector v (with L2 norm = 1);
    dot(a; b) - scalar product of two vectors a and b;
    cross(a; b) - cross product of two vectors a and b (with length 2 or 3);
  Matrix:
    Creational:
    matrix(m; n) - creates an empty matrix with dimensions m⨯n;
    identity(n) - creates an identity matrix with dimensions n⨯n;
    diagonal(n; d) - creates a n⨯n diagonal matrix and fills the diagonal with value d;
    column(m; c) - creates a column matrix with dimensions m⨯1, filled with value c;
    utriang(n) - creates an upper triangular matrix with dimensions n⨯n;
    ltriang(n) - creates a lower triangular matrix with dimensions n⨯n;
    symmetric(n) - creates a symmetric matrix with dimensions n⨯n;
    matrix_hp(m; n) - creates a high-performance matrix with dimensions m⨯n;
    identity_hp(n) - creates a high-performance identity matrix with dimensions n⨯n;
    diagonal_hp(n; d) - creates a high-performance n⨯n diagonal matrix filled with value d;
    column_hp(m; c) - creates a high-performance m⨯1 column matrix filled with value c;
    utriang_hp(n) - creates a high-performance n⨯n upper triangular matrix;
    ltriang_hp(n) - creates a high-performance n⨯n lower triangular matrix;
    symmetric_hp(n) - creates a high-performance symmetric matrix with dimensions n⨯n;
    vec2diag(v) - creates a diagonal matrix from the elements of vector v;
    vec2row(v) - creates a row matrix from the elements of vector v;
    vec2col(v) - creates a column matrix from the elements of vector v;
    join_cols(c₁; c₂; c₃…) - creates a new matrix by joining column vectors;
    join_rows(r₁; r₂; r₃…) - creates a new matrix by joining row vectors;
    augment(A; B; C…) - creates a new matrix by appending matrices A; B; C side by side;
    stack(A; B; C…) - creates a new matrix by stacking matrices A; B; C one below the other;
    Structural:
    n_rows(M) - number of rows in matrix M;
    n_cols(M) - number of columns in matrix M;
    mresize(M; m; n) - sets new dimensions m and n for matrix M;
    mfill(M; x) - fills matrix M with value x;
    fill_row(M; i; x) - fills the i-th row of matrix M with value x;
    fill_col(M; j; x) - fills the j-th column of matrix M with value x;
    copy(A; B; i; j) - copies all elements from A to B, starting from indexes i and j of B;
    add(A; B; i; j) - adds all elements from A to those of B, starting from indexes i and j of B;
    row(M; i) - extracts the i-th row of matrix M as a vector;
    col(M; j) - extracts the j-th column of matrix M as a vector;
    extract_rows(M; i) - extracts the rows from matrix M whose indexes are contained in vector i;
    extract_cols(M; j) - extracts the columns from matrix M whose indexes are contained in vector j;
    diag2vec(M) - extracts the diagonal elements of matrix M to a vector;
    submatrix(M; i₁; i₂; j₁; j₂) - extracts a submatrix of M, bounded by rows i₁ and i₂ and columns j₁ and j₂, incl.;
    Data:
    sort_cols(M; i) - sorts the columns of M based on the values in row i in ascending order;
    rsort_cols(M; i) - sorts the columns of M based on the values in row i in descending order;
    sort_rows(M; j) - sorts the rows of M based on the values in column j in ascending order;
    rsort_rows(M; j) - sorts the rows of M based on the values in column j in descending order;
    order_cols(M; i) - the indexes of the columns of M based on the ordering of the values from row i in ascending order;
    revorder_cols(M; i) - the indexes of the columns of M based on the ordering of the values from row i in descending order;
    order_rows(M; j) - the indexes of the rows of M based on the ordering of the values in column j in ascending order;
    revorder_rows(M; j) - the indexes of the rows of M based on the ordering of the values in column j in descending order;
    mcount(M; x) - number of occurrences of value x in matrix M;
    msearch(M; x; i; j) - vector with the two indexes of the first occurrence of x in matrix M, starting from indexes i and j;
    mfind(M; x) or
    mfind_eq(M; x) - the indexes of all elements in M that are = x;
    mfind_ne(M; x) - the indexes of all elements in M that are ≠ x;
    mfind_lt(M; x) - the indexes of all elements in M that are < x;
    mfind_le(M; x) - the indexes of all elements in M that are ≤ x;
    mfind_gt(M; x) - the indexes of all elements in M that are > x;
    mfind_ge(M; x) - the indexes of all elements in M that are ≥ x;
    hlookup(M; x; i₁; i₂) or
    hlookup_eq(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are = x;
    hlookup_ne(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are ≠ x;
    hlookup_lt(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are < x;
    hlookup_le(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are ≤ x;
    hlookup_gt(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are > x;
    hlookup_ge(M; x; i₁; i₂) - the values from row i₂ of M, for which the elements in row i₁ are ≥ x;
    vlookup(M; x; j₁; j₂) or
    vlookup_eq(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are = x;
    vlookup_ne(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are ≠ x;
    vlookup_lt(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are < x;
    vlookup_le(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are ≤ x;
    vlookup_gt(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are > x;
    vlookup_ge(M; x; j₁; j₂) - the values from column j₂ of M, for which the elements in column j₁ are ≥ x;
    Math:
    hprod(A; B) - Hadamard product of matrices A and B;
    fprod(A; B) - Frobenius product of matrices A and B;
    kprod(A; B) - Kronecker product of matrices A and B;
    mnorm_1(M) - L1 norm of matrix M;
    mnorm(M) or
    mnorm_2(M) - L2 norm of matrix M;
    mnorm_e(M) - Frobenius norm of matrix M;
    mnorm_i(M) - L∞ norm of matrix M;
    cond_1(M) - condition number of M based on the L1 norm;
    cond(M) or
    cond_2(M) - condition number of M based on the L2 norm;
    cond_e(M) - condition number of M based on the Frobenius norm;
    cond_i(M) - condition number of M based on the L∞ norm;
    det(M) - determinant of matrix M;
    rank(M) - rank of matrix M;
    trace(M) - trace of matrix M;
    transp(M) - transpose of matrix M;
    adj(M) - adjugate of matrix M;
    cofactor(M) - cofactor matrix of M;
    eigenvals(M; n_e) - the first n_e eigenvalues of matrix M (or all if omitted);
    eigenvecs(M; n_e) - the first n_e eigenvectors of matrix M (or all if omitted);
    eigen(M; n_e) - the first n_e eigenvalues and eigenvectors of M (or all if omitted);
    cholesky(M) - Cholesky decomposition of a symmetric, positive-definite matrix M;
    lu(M) - LU decomposition of matrix M;
    qr(M) - QR decomposition of matrix M;
    svd(M) - singular value decomposition of M;
    inverse(M) - inverse of matrix M;
    lsolve(A; b) - solves the system of linear equations Ax = b using LDLT decomposition for symmetric matrices, and LU for non-symmetric;
    clsolve(A; b) - solves the linear matrix equation Ax = b with symmetric, positive-definite matrix A using Cholesky decomposition;
    slsolve(A; b) - solves the linear matrix equation Ax = b with high-performance symmetric, positive-definite matrix A using preconditioned conjugate gradient (PCG) method;
    msolve(A; B) - solves the generalized matrix equation AX = B using LDLT decomposition for symmetric matrices, and LU for non-symmetric;
    cmsolve(A; B) - solves the generalized matrix equation AX = B with symmetric, positive-definite matrix A using Cholesky decomposition;
    smsolve(A; B) - solves the generalized matrix equation AX = B with high-performance symmetric, positive-definite matrix A using PCG method;
    fft(M) - performs fast Fourier transform of row-major matrix M. It must have one row for real data and two rows for complex;
    ift(M) - performs inverse Fourier transform of row-major matrix M. It must have one row for real data and two rows for complex;
    Double interpolation:
    take(x; y; M) - returns the element of matrix M at indexes x and y;
    line(x; y; M) - double linear interpolation from the elements of matrix M based on the values of x and y;
    spline(x; y; M) - double Hermite spline interpolation from the elements of matrix M based on the values of x and y.
    Tol - target tolerance for the iterative PCG solver.
- Comments: "Title" or 'text' in double or single quotes, respectively. HTML, CSS, JS and SVG are allowed.
- Graphing and plotting:
  $Plot { f(x) @ x = a : b } - simple plot;
  $Plot { x(t) | y(t) @ t = a : b } - parametric;
  $Plot { f1(x) & f2(x) & ... @ x = a : b } - multiple;
  $Plot { x1(t) | y1(t) & x2(t) | y2(t) & ... @ x = a : b } - multiple parametric;
  $Map { f(x; y) @ x = a : b & y = c : d } - 2D color map of a 3D surface;
  PlotHeight - height of plot area in pixels;
  PlotWidth - width of plot area in pixels;
  PlotStep - the size of the mesh for map plotting;
  PlotSVG - draw plots in vector (SVG) format;
  PlotPalette - the number of color palette to be used for surface plots (0-8);
  PlotShadows - draw surface plots with shadows;
  PlotSmooth - smooth transition of colors (= 1) or isobands (= 0) for surface plots;
  PlotLightDir - direction to light source (0-7) clockwise.
- Iterative and numerical methods:
  $Root { f(x) = const @ x = a : b } - root finding for f(x) = const;
  $Root { f(x) @ x = a : b } - root finding for f(x) = 0;
  $Find { f(x) @ x = a : b } - similar to above, but x is not required to be a precise solution;
  $Sup { f(x) @ x = a : b } - local maximum of a function;
  $Inf { f(x) @ x = a : b } - local minimum of a function;
  $Area { f(x) @ x = a : b } - adaptive Gauss-Lobatto numerical integration;
  $Integral { f(x) @ x = a : b } - Tanh-Sinh numerical integration;
  $Slope { f(x) @ x = a } - numerical differentiation;
  $Sum { f(k) @ k = a : b } - iterative sum;
  $Product { f(k) @ k = a : b } - iterative product;
  $Repeat { f(k) @ k = a : b } - general inline iterative procedure;
  Precision - relative precision for numerical methods [10-2; 10-16] (default is 10-12)
- Program flow control:
  Simple:
    #if condition
      Your code goes here
    #end if
  Alternative:
    #if condition
      Your code goes here
    #else
      Some other code
    #end if
  Complete:
    #if condition1
      Your code goes here
    #else if condition2
      Your code goes here
    #else
      Some other code
    #end if
You can add or omit as many "#else if's" as needed. Only one "#else" is allowed. You can omit this too.
- Iteration blocks:
  Simple:
    #repeat number of repetitions
      Your code goes here
    #loop
  With conditional break/coutinue:
    #repeat number of repetitions
      Your code goes here
      #if condition
        #break or #continue
      #end if
      Some more code
    #loop
  With counter:
    #for counter = start : end
      Your code goes here
    #loop
  With condition:
    #while condition
      Your code goes here
    #loop
- Modules and macros/string variables:
  Modules:
    #include filename - include external file (module);
    #local - start local section (not to be included);
    #global - start global section (to be included);
  Inline string variable:
    #def variable_name$ = content
  Multiline string variable:
    #def variable_name$
      content line 1
      content line 2
      ...
    #end def
  Inline string macro:
    #def macro_name$(param1$; param2$;...) = content
  Multiline string macro:
    #def macro_name$(param1$; param2$;...)
      content line 1
      content line 2
      ...
    #end def
- Import/Export of external data:
  Text/CSV files:
    #read M from filename.txt@R1C1:R2C2 TYPE=R SEP=',' - read matrix M from a text/CSV file;
    #write M to filename.txt@R1C1:R2C2 TYPE=N SEP=',' - write matrix M to a text/CSV file;
    #append M to filename.txt@R1C1:R2C2 TYPE=N SEP=',' - append matrix M to a text/CSV file;
  Excel files (xlsx and xlsm):
    #read M from filename.xlsx@Sheet1!A1:B2 TYPE=R - read matrix M from an Excel file;
    #write M to filename.xlsx@Sheet1!A1:B2 TYPE=N - write matrix M to an Excel file;
    #append M to filename.xlsx@Sheet1!A1:B2 TYPE=N - append matrix M to an Excel file (same as write);
  Sheet, range, TYPE and SEP can be omitted.
  For #read command, TYPE can be either of [R|D|C|S|U|L|V].
  For #write and #append commands, TYPE can be Y or N.
- Output control:
  #hide - hide the report contents;
  #show - always show the contents (default);
  #pre - show the next contents only before calculations;
  #post - show the next contents only after calculations;
  #val - show only the final result, without the equation;
  #equ - show complete equations and results (default);
  #noc - show only equations without results (no calculations);
  #nosub - do not substitute variables (no substitution);
  #novar - show equations only with substituted values (no variables);
  #varsub - show equations with variables and substituted values (default);
  #split - split equations that do not fit on a single line;
  #wrap - wrap equations that do not fit on a single line (default);
  #round n - rounds the output to n digits after the decimal point;
  #round default - restores rounding to the default settings;
  #format FFFF - specifies custom format string;
  #format default - restores the default formatting;
  #md on - enables markdown in comments;
  #md off - disables markdown in comments;
  #phasor - sets output format of complex numbers to polar phasor: A∠φ;
  #complex - sets output format of complex numbers to Cartesian algebraic: a + bi.
  Each of the above commands is effective after the current line until the end of the report or another command that overwrites it.
- Breakpoints for step-by-step execution:
  #pause - calculates to the current line and waits until resumed manually;
  #input - renders an input form to the current line and waits for user input.
- Switches for trigonometric units: #deg - degrees, #rad - radians, #gra - gradians;
- Separator for target units: |, for example: 3ft + 12in|cm will show 121.92 cm;
- Dimensionless: %, ‰, ‱, pcm, ppm, ppb, ppt, ppq;
- Angle units: °, ′, ″, deg, rad, grad, rev;
- Metric units (SI and compatible):
  Mass: g, hg, kg, t, kt, Mt, Gt, dg, cg, mg, μg, Da, u;
  Length: m, km, dm, cm, mm, μm, nm, pm, AU, ly;
  Time: s, ms, μs, ns, ps, min, h, d, w, y;
  Frequency: Hz, kHz, MHz, GHz, THz, mHz, μHz, nHz, pHz, rpm;
  Speed: kmh;
  Electric current: A, kA, MA, GA, TA, mA, μA, nA, pA;
  Temperature: °C, Δ°C, K;
  Amount of substance: mol;
  Luminous intensity: cd;
  Area: a, daa, ha;
  Volume: L, daL, hL, dL, cL, mL, μL, nL, pL;
  Force: dyn N, daN, hN, kN, MN, GN, TN, gf, kgf, tf;
  Moment: Nm, kNm;
  Pressure: Pa, daPa, hPa, kPa, MPa, GPa, TPa, dPa, cPa, mPa, μPa, nPa, pPa,
       bar, mbar, μbar, atm, at, Torr, mmHg;
  Viscosity: P, cP, St, cSt;
  Energy work: J, kJ, MJ, GJ, TJ, mJ, μJ, nJ, pJ,
        Wh, kWh, MWh, GWh, TWh, mWh, μWh, nWh, pWh
        eV, keV, MeV, GeV, TeV, PeV, EeV, cal, kcal, erg;
  Power: W, kW, MW, GW, TW, mW, μW, nW, pW, hpM, ks;
      VA, kVA, MVA, GVA, TVA, mVA, μVA, nVA, pVA,
      VAR, kVAR, MVAR, GVAR, TVAR, mVAR, μVAR, nVAR, pVAR, hpM, ks;
  Electric charge: C, kC, MC, GC, TC, mC, μC, nC, pC, Ah, mAh;
  Potential: V, kV, MV, GV, TV, mV, μV, nV, pV;
  Capacitance: F, kF, MF, GF, TF, mF, μF, nF, pF;
  Resistance: Ω, kΩ, MΩ, GΩ, TΩ, mΩ, μΩ, nΩ, pΩ;
  Conductance: S, kS, MS, GS, TS, mS, μS, nS, pS, ℧, k℧, M℧, G℧, T℧, m℧, μ℧, n℧, p℧;
  Magnetic flux: Wb , kWb, MWb, GWb, TWb, mWb, μWb, nWb, pWb;
  Magnetic flux density: T, kT, MT, GT, TT, mT, μT, nT, pT;
  Inductance: H, kH, MH, GH, TH, mH, μH, nH, pH;
  Luminous flux: lm;
  Illuminance: lx;
  Radioactivity: Bq, kBq, MBq, GBq, TBq, mBq, μBq, nBq, pBq, Ci, Rd;
  Absorbed dose: Gy, kGy, MGy, GGy, TGy, mGy, μGy, nGy, pGy;
  Equivalent dose: Sv, kSv, MSv, GSv, TSv, mSv, μSv, nSv, pSv;
  Catalytic activity: kat;
- Non-metric units (Imperial/US):
  Mass: gr, dr, oz, lb (or lbm, lb_m), klb, kipm (or kip_m), st, qr,
      cwt (or cwt_UK, cwt_US), ton (or ton_UK, ton_US), slug;
  Length: th, in, ft, yd, ch, fur, mi, ftm (or ftm_UK, ftm_US),
       cable (or cable_UK, cable_US), nmi, li, rod, pole, perch, lea;
  Speed: mph, knot;
  Temperature: °F, Δ°F, °R;
  Area: rood, ac;
  Volume, fluid: fl_oz, gi, pt, qt, gal, bbl, or:
      fl_oz_UK, gi_UK, pt_UK, qt_UK, gal_UK, bbl_UK,
      fl_oz_US, gi_US, pt_US, qt_US, gal_US, bbl_US,
  Volume, dry: (US) pt_dry, (US) qt_dry, (US) gal_dry, (US) bbl_dry,
      pk (or pk_UK, pk_US), bu (or bu_UK, bu_US);
  Force: ozf (or oz_f), lbf (or lb_f), kip (or kipf, kip_f), tonf (or ton_f), pdl;
  Pressure: osi, osf psi, psf, ksi, ksf, tsi, tsf, inHg;
  Energy/work: BTU, therm, (or therm_UK, therm_US), quad;
  Power: hp, hpE, hpS;
* Custom units - .Name = expression.
Names can include currency symbols: €, £, ₤, ¥, ¢, ₽, ₹, ₩, ₪.


Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.