44 * Email : martin.r.donk@gmail.com
55 * Source : https://github.com/jiggzson/nerdamer
66 */
7+ //better accuracy
78
89var 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