import { i128 } from '../integer/i128'; import { u128 } from '../integer/u128'; // Support only this fractions: // fp128 => 8 bits (~ 2 decimal digits) // fp128 => 16 bits (~ 4 decimal digits) // fp128 => 24 bits (~ 7 decimal digits) // fp128 => 32 bits (~ 9 decimal digits) // fp128 => 40 bits (~ 12 decimal digits) // fp128 => 48 bits (~ 14 decimal digits) // fp128 => 56 bits (~ 16 decimal digits) // fp128 => 64 bits (~ 19 decimal digits) // fp128 => 72 bits (~ 21 decimal digits) // fp128 => 80 bits (~ 24 decimal digits) // fp128 => 88 bits (~ 26 decimal digits) // fp128 => 96 bits (~ 28 decimal digits) // fp128 => 104 bits (~ 31 decimal digits) // fp128 => 112 bits (~ 33 decimal digits) // fp128 => 120 bits (~ 36 decimal digits) export class fp128 { static readonly Zero: fp128 = new fp128(0); static readonly One: fp128 = new fp128(1); protected value: i128 = i128.Zero; constructor(lo: u64 = 0, hi: i64 = 0) { this.value.lo = lo; this.value.hi = hi; } @inline get intBits(): i32 { return 128 - this.fractBits; } @inline get fractBits(): i32 { if (isReference()) { return 8 * offsetof(); } else { return 8 * sizeof(); } } @inline get int(): i128 { return this.value >>> this.fractBits; } @inline get fract(): u128 { return (chagetype(this.value)) << this.intBits; } // TODO }