mirror of
				https://github.com/eledio-devices/thirdparty-tinyexpr.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	add ncr and npr
This commit is contained in:
		
							
								
								
									
										27
									
								
								test.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								test.c
									
									
									
									
									
								
							| @@ -214,6 +214,12 @@ void test_nans() { | ||||
|         "1%(1%0)", | ||||
|         "(1%0)%1", | ||||
|         "fac(-1)", | ||||
|         "ncr(2, 4)", | ||||
|         "ncr(-2, 4)", | ||||
|         "ncr(2, -4)", | ||||
|         "npr(2, 4)", | ||||
|         "npr(-2, 4)", | ||||
|         "npr(2, -4)", | ||||
|     }; | ||||
|  | ||||
|     int i; | ||||
| @@ -242,6 +248,12 @@ void test_infs() { | ||||
|             "log(0)", | ||||
|             "pow(2,10000000)", | ||||
|             "fac(300)", | ||||
|             "ncr(300,100)", | ||||
|             "ncr(300000,100)", | ||||
|             "ncr(300000,100)*8", | ||||
|             "npr(3,2)*ncr(300000,100)", | ||||
|             "npr(100,90)", | ||||
|             "npr(30,25)", | ||||
|     }; | ||||
|  | ||||
|     int i; | ||||
| @@ -625,6 +637,21 @@ void test_combinatorics() { | ||||
|             {"fac(3)", 6}, | ||||
|             {"fac(4.8)", 24}, | ||||
|             {"fac(10)", 3628800}, | ||||
|  | ||||
|             {"ncr(0,0)", 1}, | ||||
|             {"ncr(10,1)", 10}, | ||||
|             {"ncr(10,0)", 1}, | ||||
|             {"ncr(10,10)", 1}, | ||||
|             {"ncr(16,7)", 11440}, | ||||
|             {"ncr(16,9)", 11440}, | ||||
|             {"ncr(100,95)", 75287520}, | ||||
|  | ||||
|             {"npr(0,0)", 1}, | ||||
|             {"npr(10,1)", 10}, | ||||
|             {"npr(10,0)", 1}, | ||||
|             {"npr(10,10)", 3628800}, | ||||
|             {"npr(20,5)", 1860480}, | ||||
|             {"npr(100,4)", 94109400}, | ||||
|     }; | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										19
									
								
								tinyexpr.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								tinyexpr.c
									
									
									
									
									
								
							| @@ -125,7 +125,7 @@ static double fac(double a) {/* simplest version of fac */ | ||||
|     if (a > UINT_MAX) | ||||
|         return INFINITY; | ||||
|     unsigned int ua = (unsigned int)(a); | ||||
|     unsigned long int result = 1, i = 1; | ||||
|     unsigned long int result = 1, i; | ||||
|     for (i = 1; i <= ua; i++) { | ||||
|         if (i > ULONG_MAX / result) | ||||
|             return INFINITY; | ||||
| @@ -133,6 +133,21 @@ static double fac(double a) {/* simplest version of fac */ | ||||
|     } | ||||
|     return (double)result; | ||||
| } | ||||
| static double ncr(double n, double r) { | ||||
|     if (n < 0.0 || r < 0.0 || n < r) return NAN; | ||||
|     if (n > UINT_MAX || r > UINT_MAX) return INFINITY; | ||||
|     unsigned long int un = (unsigned int)(n), ur = (unsigned int)(r), i; | ||||
|     unsigned long int result = 1; | ||||
|     if (ur > un / 2) ur = un - ur; | ||||
|     for (i = 1; i <= ur; i++) { | ||||
|         if (result > ULONG_MAX / (un - ur + i)) | ||||
|             return INFINITY; | ||||
|         result *= un - ur + i; | ||||
|         result /= i; | ||||
|     } | ||||
|     return result; | ||||
| } | ||||
| static double npr(double n, double r) {return ncr(n, r) * fac(r);} | ||||
|  | ||||
| static const te_variable functions[] = { | ||||
|     /* must be in alphabetical order */ | ||||
| @@ -155,6 +170,8 @@ static const te_variable functions[] = { | ||||
|     {"log", log10,    TE_FUNCTION1 | TE_FLAG_PURE, 0}, | ||||
| #endif | ||||
|     {"log10", log10,  TE_FUNCTION1 | TE_FLAG_PURE, 0}, | ||||
|     {"ncr", ncr,      TE_FUNCTION2 | TE_FLAG_PURE, 0}, | ||||
|     {"npr", npr,      TE_FUNCTION2 | TE_FLAG_PURE, 0}, | ||||
|     {"pi", pi,        TE_FUNCTION0 | TE_FLAG_PURE, 0}, | ||||
|     {"pow", pow,      TE_FUNCTION2 | TE_FLAG_PURE, 0}, | ||||
|     {"sin", sin,      TE_FUNCTION1 | TE_FLAG_PURE, 0}, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user