| 
									
										
										
										
											2017-04-30 04:54:41 +00:00
										 |  |  | function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ { | 
					
						
							| 
									
										
										
										
											2017-03-21 07:45:12 +00:00
										 |  |  | 	var sgn = x < 0 ? -1 : 1; | 
					
						
							|  |  |  | 	var B = x * sgn; | 
					
						
							|  |  |  | 	var P_2 = 0, P_1 = 1, P = 0; | 
					
						
							|  |  |  | 	var Q_2 = 1, Q_1 = 0, Q = 0; | 
					
						
							|  |  |  | 	var A = Math.floor(B); | 
					
						
							|  |  |  | 	while(Q_1 < D) { | 
					
						
							|  |  |  | 		A = Math.floor(B); | 
					
						
							|  |  |  | 		P = A * P_1 + P_2; | 
					
						
							|  |  |  | 		Q = A * Q_1 + Q_2; | 
					
						
							| 
									
										
										
										
											2017-04-30 04:54:41 +00:00
										 |  |  | 		if((B - A) < 0.00000005) break; | 
					
						
							| 
									
										
										
										
											2017-03-21 07:45:12 +00:00
										 |  |  | 		B = 1 / (B - A); | 
					
						
							|  |  |  | 		P_2 = P_1; P_1 = P; | 
					
						
							|  |  |  | 		Q_2 = Q_1; Q_1 = Q; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-30 04:54:41 +00:00
										 |  |  | 	if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } | 
					
						
							| 
									
										
										
										
											2017-03-21 07:45:12 +00:00
										 |  |  | 	if(!mixed) return [0, sgn * P, Q]; | 
					
						
							|  |  |  | 	var q = Math.floor(sgn * P/Q); | 
					
						
							|  |  |  | 	return [q, sgn*P - q*Q, Q]; | 
					
						
							|  |  |  | } |