86c99b10a2
* Activate more linting rules from eslint and typescript * Properly add VForm as type information * Fix usage of native types * Fix more linting issues * Rename vuetify types file, add VTooltip * Fix some more typing problems * Use composition API for more components * Convert RecipeRating * Convert RecipeNutrition * Convert more components to composition API * Fix globals plugin for type checking * Add missing icon types * Fix vuetify types in Nuxt context * Use composition API for RecipeActionMenu * Convert error.vue to composition API * Convert RecipeContextMenu to composition API * Use more composition API and type checking in recipe/create * Convert AppButtonUpload to composition API * Fix some type checking in RecipeContextMenu * Remove unused components BaseAutoForm and BaseColorPicker * Convert RecipeCategoryTagDialog to composition API * Convert RecipeCardSection to composition API * Convert RecipeCategoryTagSelector to composition API * Properly import vuetify type definitions * Convert BaseButton to composition API * Convert AutoForm to composition API * Remove unused requests API file * Remove static routes from recipe API * Fix more type errors * Convert AppHeader to composition API, fixing some search bar focus problems * Convert RecipeDialogSearch to composition API * Update API types from pydantic models, handle undefined values * Improve more typing problems * Add types to other plugins * Properly type the CRUD API access * Fix typing of static image routes * Fix more typing stuff * Fix some more typing problems * Turn off more rules
76 lines
1.5 KiB
TypeScript
76 lines
1.5 KiB
TypeScript
/* frac.js (C) 2012-present SheetJS -- http://sheetjs.com */
|
|
/* https://developer.aliyun.com/mirror/npm/package/frac/v/0.3.0 Apache license */
|
|
|
|
function frac(x: number, D: number, mixed: boolean) {
|
|
let n1 = Math.floor(x);
|
|
let d1 = 1;
|
|
let n2 = n1 + 1;
|
|
let d2 = 1;
|
|
if (x !== n1)
|
|
while (d1 <= D && d2 <= D) {
|
|
const m = (n1 + n2) / (d1 + d2);
|
|
if (x === m) {
|
|
if (d1 + d2 <= D) {
|
|
d1 += d2;
|
|
n1 += n2;
|
|
d2 = D + 1;
|
|
} else if (d1 > d2) d2 = D + 1;
|
|
else d1 = D + 1;
|
|
break;
|
|
} else if (x < m) {
|
|
n2 = n1 + n2;
|
|
d2 = d1 + d2;
|
|
} else {
|
|
n1 = n1 + n2;
|
|
d1 = d1 + d2;
|
|
}
|
|
}
|
|
if (d1 > D) {
|
|
d1 = d2;
|
|
n1 = n2;
|
|
}
|
|
if (!mixed) return [0, n1, d1];
|
|
const q = Math.floor(n1 / d1);
|
|
return [q, n1 - q * d1, d1];
|
|
}
|
|
function cont(x: number, D: number, mixed: boolean) {
|
|
const sgn = x < 0 ? -1 : 1;
|
|
let B = x * sgn;
|
|
let P_2 = 0;
|
|
let P_1 = 1;
|
|
let P = 0;
|
|
let Q_2 = 1;
|
|
let Q_1 = 0;
|
|
let Q = 0;
|
|
let A = Math.floor(B);
|
|
while (Q_1 < D) {
|
|
A = Math.floor(B);
|
|
P = A * P_1 + P_2;
|
|
Q = A * Q_1 + Q_2;
|
|
if (B - A < 0.00000005) break;
|
|
B = 1 / (B - A);
|
|
P_2 = P_1;
|
|
P_1 = P;
|
|
Q_2 = Q_1;
|
|
Q_1 = Q;
|
|
}
|
|
if (Q > D) {
|
|
if (Q_1 > D) {
|
|
Q = Q_2;
|
|
P = P_2;
|
|
} else {
|
|
Q = Q_1;
|
|
P = P_1;
|
|
}
|
|
}
|
|
if (!mixed) return [0, sgn * P, Q];
|
|
const q = Math.floor((sgn * P) / Q);
|
|
return [q, sgn * P - q * Q, Q];
|
|
}
|
|
|
|
export const useFraction = function () {
|
|
return {
|
|
frac,
|
|
cont,
|
|
};
|
|
};
|