Add hyperbolic functions

This commit is contained in:
Tom Payne
2013-02-13 14:05:36 +01:00
parent 9053e1dfc8
commit 00ce5c6a78
2 changed files with 191 additions and 0 deletions

57
src/ol/math.js Normal file
View File

@@ -0,0 +1,57 @@
goog.provide('ol.math');
/**
* @param {number} x X.
* @return {number} Hyperbolic cosine of x.
*/
ol.math.cosh = function(x) {
return (Math.exp(x) + Math.exp(-x)) / 2;
};
/**
* @param {number} x X.
* @return {number} Hyperbolic cotangent of x.
*/
ol.math.coth = function(x) {
var expMinusTwoX = Math.exp(-2 * x);
return (1 + expMinusTwoX) / (1 - expMinusTwoX);
};
/**
* @param {number} x X.
* @return {number} Hyperbolic cosecant of x.
*/
ol.math.csch = function(x) {
return 2 / (Math.exp(x) - Math.exp(-x));
};
/**
* @param {number} x X.
* @return {number} Hyperbolic secant of x.
*/
ol.math.sech = function(x) {
return 2 / (Math.exp(x) + Math.exp(-x));
};
/**
* @param {number} x X.
* @return {number} Hyperbolic sine of x.
*/
ol.math.sinh = function(x) {
return (Math.exp(x) - Math.exp(-x)) / 2;
};
/**
* @param {number} x X.
* @return {number} Hyperbolic tangent of x.
*/
ol.math.tanh = function(x) {
var expMinusTwoX = Math.exp(-2 * x);
return (1 - expMinusTwoX) / (1 + expMinusTwoX);
};

134
test/spec/ol/math.test.js Normal file
View File

@@ -0,0 +1,134 @@
goog.provide('ol.test.math');
describe('ol.math.cosh', function() {
it('returns the correct value at -Infinity', function() {
expect(ol.math.cosh(-Infinity)).toEqual(Infinity);
});
it('returns the correct value at -1', function() {
expect(ol.math.cosh(-1)).toRoughlyEqual(1.5430806348152437, 1e-9);
});
it('returns the correct value at 0', function() {
expect(ol.math.cosh(0)).toEqual(1);
});
it('returns the correct value at 1', function() {
expect(ol.math.cosh(1)).toRoughlyEqual(1.5430806348152437, 1e-9);
});
it('returns the correct value at Infinity', function() {
expect(ol.math.cosh(Infinity)).toEqual(Infinity);
});
});
describe('ol.math.coth', function() {
it('returns the correct value at -1', function() {
expect(ol.math.coth(-1)).toRoughlyEqual(-1.3130352854993312, 1e-9);
});
it('returns the correct value at 1', function() {
expect(ol.math.coth(1)).toRoughlyEqual(1.3130352854993312, 1e-9);
});
it('returns the correct value at Infinity', function() {
expect(ol.math.coth(Infinity)).toEqual(1);
});
});
describe('ol.math.csch', function() {
it('returns the correct value at -Infinity', function() {
expect(ol.math.csch(-Infinity)).toEqual(0);
});
it('returns the correct value at -1', function() {
expect(ol.math.csch(-1)).toRoughlyEqual(-0.85091812823932156, 1e-9);
});
it('returns the correct value at 1', function() {
expect(ol.math.csch(1)).toRoughlyEqual(0.85091812823932156, 1e-9);
});
it('returns the correct value at Infinity', function() {
expect(ol.math.csch(Infinity)).toEqual(0);
});
});
describe('ol.math.sech', function() {
it('returns the correct value at -Infinity', function() {
expect(ol.math.sech(-Infinity)).toEqual(0);
});
it('returns the correct value at -1', function() {
expect(ol.math.sech(-1)).toRoughlyEqual(0.64805427366388535, 1e-9);
});
it('returns the correct value at 0', function() {
expect(ol.math.sech(0)).toEqual(1);
});
it('returns the correct value at 1', function() {
expect(ol.math.sech(1)).toRoughlyEqual(0.64805427366388535, 1e-9);
});
it('returns the correct value at Infinity', function() {
expect(ol.math.sech(Infinity)).toEqual(0);
});
});
describe('ol.math.sinh', function() {
it('returns the correct value at -Infinity', function() {
expect(ol.math.sinh(-Infinity)).toEqual(-Infinity);
});
it('returns the correct value at -1', function() {
expect(ol.math.sinh(-1)).toRoughlyEqual(-1.1752011936438014, 1e-9);
});
it('returns the correct value at 0', function() {
expect(ol.math.sinh(0)).toEqual(0);
});
it('returns the correct value at 1', function() {
expect(ol.math.sinh(1)).toRoughlyEqual(1.1752011936438014, 1e-9);
});
it('returns the correct value at Infinity', function() {
expect(ol.math.cosh(Infinity)).toEqual(Infinity);
});
});
describe('ol.math.tanh', function() {
it('returns the correct value at -1', function() {
expect(ol.math.tanh(-1)).toRoughlyEqual(-0.76159415595576485, 1e-9);
});
it('returns the correct value at 0', function() {
expect(ol.math.tanh(0)).toEqual(0);
});
it('returns the correct value at 1', function() {
expect(ol.math.tanh(1)).toRoughlyEqual(0.76159415595576485, 1e-9);
});
});
goog.require('ol.math');