Failed to fetch fork details. Try again later.
-
Delaigue Olivier authoredddf30bac
Forked from
HYCAR-Hydro / airGR
Source project has a limited visibility.
/**
* Gestion des messages de debogage dans la console
* @note Implémenter cette interface pour toutes les classes à debugguer
* Dans le constructeur, utiliser super(true) pour debugger la classe, super(false) sinon.
*/
export interface IDebug {
readonly DBG: boolean;
debug(s: any): void;
}
export class Debug {
/**
* @param _DBG Flag de débuggage
*/
constructor(private _DBG: boolean) { }
/**
* Affiche un message dans la console si le flag this.DBG est à true
* @param s Message à afficher dans la console
*/
public debug(...args: any[]) {
// tslint:disable-next-line:no-console
if (this._DBG) {
// tslint:disable-next-line:no-console
console.log(...args);
}
}
get DBG() { return this._DBG; }
}
/**
* Méthode simulant l'opérateur booléen xor
* @see http://www.howtocreate.co.uk/xor.html
*/
export function XOR(a: boolean, b: boolean): boolean {
return (a || b) && !(a && b);
}
/**
* Méthode simulant l'opérateur booléen identité (vrai si a=b)
*/
export function BoolIdentity(a: boolean, b: boolean): boolean {
return (a && b) || (!a && !b);
}
/**
* arrondi d'un nombre avec une précision donnée
* @param val nombre à arrondir
* @param prec nombre de chiffres
*/
export function round(val: number, prec: number) {
const m = Math.pow(10, prec || 0);
return Math.round(val * m) / m;
}
export function isNumeric(s: string): boolean {
if (s !== undefined && s !== null) {
const trimmed = s.trim();
return trimmed !== "" && !isNaN(Number(trimmed));
}
return false;
}
/**
* Retourne true si a et b sont égaux à e près (en gros)
*/
export function isEqual(a: number, b: number, e: number = 1E-7): boolean {
7172737475767778798081828384858687888990919293949596979899100101102103104105
if (a === 0 && b === 0) {
return true;
}
if (b === 0) { // ne pas diviser par 0
[ a, b ] = [ b, a ];
}
if (a === 0) { // éviter d'avoir un quotient toujours nul
return (Math.abs(b) < e);
}
// cas général
return (Math.abs((a / b) - 1) < e);
}
/**
* Division entière de a par b, plus modulo, avec une tolérance e
* pour gérer le cas des nombres réels
*/
export function floatDivAndMod(a: number, b: number, e: number = 1E-7): { q: number, r: number } {
let q = Math.floor(a / b);
let r = a % b;
// si le modulo est bon à un pouïème, pas de reste
if (isEqual(r, b)) {
r = 0;
// si la division entière n'est pas tombée juste, +1 au quotient
if (q !== (a / b)) {
q++;
}
}
// si le modulo est nul à un pouïème, il est nul
if (isEqual(r, 0)) {
r = 0;
}
return { q, r };
}