Skip to content

Commit 98c7678

Browse files
authored
Merge pull request jiggzson#51 from jiggzson/dev
Dev
2 parents 7379a92 + d59196e commit 98c7678

1 file changed

Lines changed: 148 additions & 4 deletions

File tree

nerdamer.core.js

Lines changed: 148 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
* Email : martin.r.donk@gmail.com
55
* Source : https://github.com/jiggzson/nerdamer
66
*/
7+
//better accuracy
78

89
var nerdamer = (function(imports) {
910
"use strict";
1011

11-
var version = '0.6.3',
12+
var version = '0.6.4',
1213
_ = new Parser(), //nerdamer's parser
1314
//import bigInt
1415
bigInt = imports.bigInt,
@@ -1173,7 +1174,7 @@ var nerdamer = (function(imports) {
11731174
return true;
11741175
},
11751176
isPi: function() {
1176-
return this.value === 'pi';
1177+
return this.group === S && this.value === 'pi';
11771178
},
11781179
isE: function() {
11791180
return this.value === 'e';
@@ -2374,8 +2375,107 @@ var nerdamer = (function(imports) {
23742375
return retval;
23752376
}
23762377

2378+
function cos(symbol) {
2379+
if(Settings.PARSE2NUMBER && symbol.isConstant()) {
2380+
return new Symbol(Math.cos(symbol.valueOf()));
2381+
}
2382+
2383+
var retval,
2384+
m = symbol.multiplier.abs();
2385+
symbol.multiplier = m;
2386+
2387+
if(symbol.isPi() && symbol.isLinear()) {
2388+
if(isInt(m)) {
2389+
retval = new Symbol(even(m) ? -1 : 1);
2390+
}
2391+
else {
2392+
var n = m.num, d = m.den;
2393+
if(d == 2) retval = new Symbol(0);
2394+
else if(d == 3) retval = _.parse('1/2');
2395+
else if(d == 4) retval = _.parse('1/sqrt(2)');
2396+
else if(d == 6) retval = _.parse('sqrt(3)/2');
2397+
else retval = _.symfunction('cos', [symbol]);
2398+
2399+
if(even(n)) retval.negate();
2400+
}
2401+
}
2402+
2403+
if(!retval) retval = _.symfunction('cos', [symbol]);
2404+
2405+
return retval;
2406+
}
2407+
2408+
function sin(symbol) {
2409+
if(Settings.PARSE2NUMBER && symbol.isConstant()) {
2410+
return new Symbol(Math.sin(symbol.valueOf()));
2411+
}
2412+
var retval,
2413+
sign = Math.sign(symbol.multiplier),
2414+
m = symbol.multiplier.abs();
2415+
2416+
symbol.multiplier = m;
2417+
2418+
if(symbol.isPi() && symbol.isLinear()) {
2419+
if(isInt(m)) {
2420+
retval = new Symbol(0);
2421+
}
2422+
else {
2423+
var n = m.num, d = m.den;
2424+
if(d == 2) retval = new Symbol(1);
2425+
else if(d == 3) retval = _.parse('sqrt(3)/2');
2426+
else if(d == 4) retval = _.parse('1/sqrt(2)');
2427+
else if(d == 6) retval = _.parse('1/2');
2428+
else retval = _.symfunction('sin', [symbol]);
2429+
}
2430+
}
2431+
2432+
if(!retval) retval = _.symfunction('sin', [symbol]);
2433+
2434+
if(sign < 0) retval.negate();
2435+
2436+
return retval;
2437+
}
2438+
2439+
function tan(symbol) {
2440+
if(Settings.PARSE2NUMBER && symbol.isConstant()) {
2441+
return new Symbol(Math.sin(symbol.valueOf()));
2442+
}
2443+
var retval,
2444+
m = symbol.multiplier;
2445+
2446+
symbol.multiplier = m;
2447+
2448+
if(symbol.isPi() && symbol.isLinear()) {
2449+
if(isInt(m)) {
2450+
retval = new Symbol(0);
2451+
}
2452+
else {
2453+
var n = m.num, d = m.den;
2454+
if(d == 2) err('tan is undefined for pi/2');
2455+
else if(d == 3) {
2456+
retval = _.parse('sqrt(3)');
2457+
if(n%3 == 2) retval.negate();
2458+
}
2459+
else if(d == 4) {
2460+
retval = new Symbol(1);
2461+
if((n+1)%4 == 0) retval.negate();
2462+
}
2463+
else if(d == 6) {
2464+
retval = _.parse('sqrt(3)').negate();
2465+
if(n%3 == 2) retval.negate();
2466+
}
2467+
else retval = _.symfunction('tan', [symbol]);
2468+
}
2469+
}
2470+
2471+
if(!retval) retval = _.symfunction('tan', [symbol]);
2472+
2473+
return retval;
2474+
}
2475+
23772476
/**
23782477
* Expands a symbol
2478+
* @param symbol
23792479
*/
23802480
function expand(symbol) {
23812481
var p = symbol.power,
@@ -3115,12 +3215,16 @@ var nerdamer = (function(imports) {
31153215

31163216
if(aIsConstant && bIsConstant && Settings.PARSE2NUMBER) {
31173217
var base = a.multiplier.toDecimal(), e = b.multiplier.toDecimal();
3218+
31183219
var sign = new Symbol(1);
3119-
if(b.multiplier.den.isOdd) {
3220+
if(b.multiplier.den.isOdd()) {
31203221
var abs_base = Math.abs(base);
31213222
sign = new Symbol(base/abs_base);
31223223
base = abs_base;
31233224
}
3225+
3226+
if(even(e)) sign = new Symbol(1);
3227+
31243228
result = _.multiply(new Symbol(Math.pow(base, e)), sign);
31253229
}
31263230
else if(bIsInt && !m.equals(1)) {
@@ -3270,7 +3374,7 @@ var nerdamer = (function(imports) {
32703374
fullConversion: function( dec ) {
32713375
var done = false;
32723376
//you can adjust the epsilon to a larger number if you don't need very high precision
3273-
var n1 = 0, d1 = 1, n2 = 1, d2 = 0, n = 0, q = dec, epsilon = 1e-13;
3377+
var n1 = 0, d1 = 1, n2 = 1, d2 = 0, n = 0, q = dec, epsilon = 1e-16;
32743378
while(!done) {
32753379
n++;
32763380
if( n > 10000 ){
@@ -3361,6 +3465,44 @@ var nerdamer = (function(imports) {
33613465
}
33623466

33633467
},
3468+
//greek mapping
3469+
greek: {
3470+
alpha: '\\alpha',
3471+
beta: '\\beta',
3472+
gamma: '\\gamma',
3473+
delta: '\\delta',
3474+
epsilon: '\\epsilon',
3475+
zeta: '\\zeta',
3476+
eta: '\\eta',
3477+
theta: '\\theta',
3478+
iota: '\\iota',
3479+
kappa: '\\kappa',
3480+
lambda: '\\lambda',
3481+
mu: '\\mu',
3482+
nu: '\\nu',
3483+
xi: '\\xi',
3484+
omnikron: '\\omnikron',
3485+
pi: '\\pi',
3486+
rho: '\\rho',
3487+
sigma: '\\sigma',
3488+
tau: '\\tau',
3489+
upsilon: '\\upsilon',
3490+
phi: '\\phi',
3491+
chi: '\\chi',
3492+
psi: '\\psi',
3493+
omega: '\\omega',
3494+
Gamma: '\\Gamma',
3495+
Delta: '\\Delta',
3496+
Epsilon: '\\Epsilon',
3497+
Theta: '\\Theta',
3498+
Lambda: '\\Lambda',
3499+
Xi: '\\Xi',
3500+
Pi: '\\Pi',
3501+
Sigma: '\\Sigma',
3502+
Phi: '\\Phi',
3503+
Psi: '\\Psi',
3504+
Omega: '\\Omega'
3505+
},
33643506
//get the raw value of the symbol as an array
33653507
value: function(symbol, inverted, option, negative) {
33663508
var group = symbol.group,
@@ -3370,6 +3512,8 @@ var nerdamer = (function(imports) {
33703512
/*if(group === N) //do nothing since we want to return top & bottom blank; */
33713513
if(group === S || group === P || previousGroup === S || previousGroup === P || previousGroup === N) {
33723514
var value = symbol.value;
3515+
var greek = this.greek[value];
3516+
if(greek) value = greek;
33733517
v[index] = value;
33743518
}
33753519
else if(group === FN || previousGroup === FN) {

0 commit comments

Comments
 (0)