Public
Edited
May 19, 2024
Importers
5 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function creal (a) {
return a[0];
}
Insert cell
function cimag(a) {
return a[1];
}
Insert cell
Insert cell
function ccreateS () {
return [0, 0]
}
Insert cell
function ccreateD () {
return [0, 0, 0, 0]
}
Insert cell
Insert cell
function cfromValuesD (a, b, c, d) {
return [a, b, c, d]
}
Insert cell
function cfromValuesS (a, b) {
return [a, b]
}
Insert cell
Insert cell
function csetValuesD (out, a, b, c, d) {
out[0] = a
out[1] = b
out[2] = c
out[3] = d
return out
}
Insert cell
function csetValuesS (out, a, b) {
out[0] = a
out[1] = b
return out
}
Insert cell
Insert cell
function ccopyS (out, a) {
out[0] = a[0]
out[1] = a[1]
return out
}
Insert cell
function ccopyD (out, a) {
out[0] = a[0]
out[1] = a[1]
out[2] = a[2]
out[3] = a[3]
return out
}
Insert cell
Insert cell
function cscaleS (out, a, s) {
out[0] = a[0] * s
out[1] = a[1] * s
return out
}
Insert cell
function cscaleD (out, a, s) {
out[0] = a[0] * s
out[1] = a[1] * s
out[2] = a[2] * s
out[3] = a[3] * s
return out
}
Insert cell
Insert cell
function caddSS (out, a, b) {
out[0] = a[0] + b[0]
out[1] = a[1] + b[1]
return out
}
Insert cell
function caddSD (out, a, b) {
out[0] = a[0] + b[0]
out[1] = a[1] + b[1]
out[2] = b[2]
out[3] = b[3]
return out
}
Insert cell
function caddDS (out, a, b) {
out[0] = a[0] + b[0]
out[1] = a[1] + b[1]
out[2] = a[2]
out[3] = a[3]
return out
}
Insert cell
function caddDD (out, a, b) {
out[0] = a[0] + b[0]
out[1] = a[1] + b[1]
out[2] = a[2] + b[2]
out[3] = a[3] + b[3]
return out
}
Insert cell
Insert cell
Insert cell
function csubSS (out, a, b) {
out[0] = a[0] - b[0]
out[1] = a[1] - b[1]
return out
}
Insert cell
function csubSD (out, a, b) {
out[0] = a[0] - b[0]
out[1] = a[1] - b[1]
out[2] = -b[2]
out[3] = -b[3]
return out
}
Insert cell
function csubDS (out, a, b) {
out[0] = a[0] - b[0]
out[1] = a[1] - b[1]
out[2] = a[2]
out[3] = a[3]
return out
}
Insert cell
function csubDD (out, a, b) {
out[0] = a[0] - b[0]
out[1] = a[1] - b[1]
out[2] = a[2] - b[2]
out[3] = a[3] - b[3]
return out
}
Insert cell
Insert cell
Insert cell
function cmulSS (out, a, b) {
var ar = a[0], ai = a[1]
var br = b[0], bi = b[1]
out[0] = ar * br - ai * bi
out[1] = ar * bi + ai * br
return out
}
Insert cell
function cmulSD (out, a, b) {
var ar = a[0], ai = a[1]
var br = b[0], bi = b[1], bu = b[2], bv = b[3]
out[0] = ar * br - ai * bi
out[1] = ar * bi + ai * br
out[2] = ar * bu - ai * bv
out[3] = ar * bv + ai * bu
return out;
}
Insert cell
//function cmulDS (out, a, b) {
// var ar = a[0], ai = a[1], au = a[2], av = a[3]
// var br = b[0], bi = b[1]
// out[0] = -a[1]
// out[1] = a[0]
// out[2] = -a[3]
// out[3] = a[2]
// return out;
//}
Insert cell
function cmulDS (out, a, b) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
var br = b[0], bi = b[1]
out[0] = ar * br - ai * bi
out[1] = ar * bi + ai * br
out[2] = au * br - av * bi
out[3] = au * bi + av * br
return out;
}
Insert cell
function cmulDD (out, a, b) {
var ar = a[0], ai = a[1], dar = a[2], av = a[3]
var br = b[0], bi = b[1], bu = b[2], bv = b[3]
out[0] = ar * br - ai * bi;
out[1] = ar * bi + ai * br;
out[2] = ar * bu - ai * bv + dar * br - av * bi;
out[3] = ar * bv + ai * bu + dar * bi + av * br;
return out;
}
Insert cell
Insert cell
Insert cell
function cinvS (out, b) {
var br = b[0], bi = b[1]
var e, f;
if (Math.abs(br) >= Math.abs(bi)) {
e = bi / br
f = 1 / (br + bi * e)
out[0] = f
out[1] = -e * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[0] = e * f
out[1] = -f
}
return out
}
Insert cell
Insert cell
Insert cell
function cdivSS (out, a, b) {
var ar = a[0], ai = a[1]
var br = b[0], bi = b[1]
var e, f;
if (Math.abs(br) >= Math.abs(bi)) {
e = bi / br
f = 1 / (br + bi * e)
out[0] = (ar + ai * e) * f
out[1] = (ai - ar * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[0] = (ar * e + ai) * f
out[1] = (ai * e - ar) * f
}
return out
}
Insert cell
function cdivSD (out, a, b) {
var ar = a[0], ai = a[1]
var br = b[0], bi = b[1], dbr = b[2], dbi = b[3]
var aobr, aobi
var e, f
var r = Math.abs(br) >= Math.abs(bi)
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[0] = aobr = (ar + ai * e) * f
out[1] = aobi = (ai - ar * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[0] = aobr = (ar * e + ai) * f
out[1] = aobi = (ai * e - ar) * f
}
// Compute the differential - a * db / b^2 but instead as
// -((a / b) * db) / b
var numr = aobr * dbr - aobi * dbi
var numi = aobr * dbi + aobi * dbr
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[2] = -(numr + numi * e) * f
out[3] = -(numi - numr * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[2] = -(numr * e + numi) * f
out[3] = -(numi * e - numr) * f
}
return out
}
Insert cell
function cdivDS (out, a, b) {
var ar = a[0], ai = a[1], dar = a[2], dai = a[3]
var br = b[0], bi = b[1]
var aobr, aobi
var e, f
var r = Math.abs(br) >= Math.abs(bi)
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[0] = aobr = (ar + ai * e) * f
out[1] = aobi = (ai - ar * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[0] = aobr = (ar * e + ai) * f
out[1] = aobi = (ai * e - ar) * f
}
// Compute the differential da / b
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[2] = (dar + dai * e) * f
out[3] = (dai - dar * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[2] = (dar * e + dai) * f
out[3] = (dai * e - dar) * f
}
return out
}
Insert cell
function cdivDD (out, a, b) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
var br = b[0], bi = b[1], bu = b[2], bv = b[3]
var aobr, aobi
var e, f
var r = Math.abs(br) >= Math.abs(bi)
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[0] = aobr = (ar + ai * e) * f
out[1] = aobi = (ai - ar * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[0] = aobr = (ar * e + ai) * f
out[1] = aobi = (ai * e - ar) * f
}
// Compute the differential (b * da - a * db) / b^2 but instead as
// (da - (a / b) * db) / b so that we use the result we've already
// computed and avoid floating point overflow
var numr = au - aobr * bu + aobi * bv
var numi = av - aobr * bv - aobi * bu
if (r) {
e = bi / br
f = 1 / (br + bi * e)
out[2] = (numr + numi * e) * f
out[3] = (numi - numr * e) * f
} else {
e = br / bi
f = 1 / (br * e + bi)
out[2] = (numr * e + numi) * f
out[3] = (numi * e - numr) * f
}
return out
}
Insert cell
Insert cell
Insert cell
function csqrS (out, a) {
var ar = a[0]
var ai = a[1]
out[0] = ar * ar - ai * ai
out[1] = 2.0 * ar * ai
return out
}
Insert cell
function csqrD (out, a) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
out[0] = ar * ar - ai * ai
out[1] = 2 * ar * ai
out[2] = 2 * (ar * au - ai * av)
out[3] = 2 * (ar * av + ai * au)
return out;
}
Insert cell
Insert cell
Insert cell
function csqrtD (out, a) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
var mod = Math.hypot(ar, ai)
var br, bi
var c = Math.sqrt(2 * (mod + ar))
var d = Math.sqrt(2 * (mod - ar))
br = ar >= 0 ? 0.5 * c : Math.abs(ai) / d
bi = ar <= 0 ? 0.5 * d : Math.abs(ai) / c
bi = ai < 0 ? -bi : bi
out[0] = br
out[1] = bi
var e, f;
if (Math.abs(br) >= Math.abs(bi)) {
e = bi / br
f = 0.5 / (br + bi * e)
out[2] = (au + av * e) * f
out[3] = (av - au * e) * f
} else {
e = br / bi
f = 0.5 / (br * e + bi)
out[2] = (au * e + av) * f
out[3] = (av * e - au) * f
}
return out
}
Insert cell
function csqrtAltD(out, a) {
var ar = -a[0],
ai = -a[1],
au = -a[2],
av = -a[3];
var mod = Math.hypot(ar, ai);
var br, bi;
var c = Math.sqrt(2 * (mod + ar));
var d = Math.sqrt(2 * (mod - ar));
br = ar >= 0 ? 0.5 * c : Math.abs(ai) / d;
bi = ar <= 0 ? 0.5 * d : Math.abs(ai) / c;
bi = ai < 0 ? -bi : bi;

out[0] = -bi;
out[1] = br;

var e, f;
if (Math.abs(br) >= Math.abs(bi)) {
e = bi / br;
f = 0.5 / (br + bi * e);
out[2] = -(av - au * e) * f;
out[3] = (au + av * e) * f;
} else {
e = br / bi;
f = 0.5 / (br * e + bi);
out[2] = -(av * e - au) * f;
out[3] = (au * e + av) * f;
}

return out;
}
Insert cell
function csqrtS (out, a) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
var mod = Math.hypot(ar, ai)
var br, bi
if (ar >= 0) {
br = 0.5 * Math.sqrt(2 * (mod + ar))
} else {
br = Math.abs(ai) / Math.sqrt(2 * (mod - ar))
}
if (ar <= 0) {
bi = 0.5 * Math.sqrt(2 * (mod - ar))
} else {
bi = Math.abs(ai) / Math.sqrt(2 * (mod + ar))
}
out[0] = br
out[1] = bi = ai < 0 ? -bi : bi
return out
}
Insert cell
Insert cell
Insert cell
function cexpS (out, a) {
var ai = a[1]
var e = Math.exp(a[0])
out[0] = e * Math.cos(ai)
out[1] = e * Math.sin(ai)
return out
}
Insert cell
function cexpD (out, a) {
var ar = a[0], ai = a[1], au = a[2], av = a[3]
var e = Math.exp(ar)
var re = e * Math.cos(ai)
var im = e * Math.sin(ai)
out[0] = re
out[1] = im
out[2] = re * au - im * av
out[3] = re * av + im * au
return out
}
Insert cell
Insert cell
Insert cell
function csinhcoshD (sinhOut, coshOut, a) {
var ar = a[0], ai = a[1], dar = a[2], dai = a[3]
var e = Math.exp(ar)
var c = 0.5 * Math.cos(ai)
var s = 0.5 * Math.sin(ai)
var epr = c * e
var epi = s * e
var emr = c / e
var emi = -s / e
var epu = epr * dar - epi * dai
var epv = epr * dai + epi * dar
var emu = emr * dar - emi * dai
var emv = emr * dai + emi * dar
var sr = sinhOut[0] = epr - emr
var si = sinhOut[1] = epi - emi
var cr = coshOut[0] = epr + emr
var ci = coshOut[1] = epi + emi
sinhOut[2] = cr * dar - ci * dai
sinhOut[3] = cr * dai + ci * dar
coshOut[2] = sr * dar - si * dai
coshOut[3] = sr * dai + si * dar
}
Insert cell
Insert cell
Insert cell
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more