internal Bignum(double value) : this() { string number = value.ToString("e14", CultureInfo.InvariantCulture); int eIndex = number.IndexOf('e'); if (number[eIndex - 1] == '0') { int count = 0; for (int i = eIndex - 1; i > number.IndexOf('.') + 1; i--) { if (number[i] == '0') count++; else break; } number = number.Remove(eIndex - count, count); } number = number.Remove(number.IndexOf('.'), 1); int exp = int.Parse(number.Substring(number.IndexOf('e') + 1), CultureInfo.InvariantCulture); exp -= number.IndexOf('e') - 1; if (value < 0) exp++; string dd = number.Remove(number.IndexOf('e')); long digits = long.Parse(dd, CultureInfo.InvariantCulture); IronMath.integer x = IronMath.integer.make((int)digits); IronMath.integer y = IronMath.integer.make(10).pow(exp); this.value = IronMath.integer.multiply(x, y); }
public Bignum(int sign, string number, int bas) : this() { value = IronMath.integer.ZERO; for (int i = 0; i < number.Length ; i++) { uint digit = (uint)(char.IsDigit(number[i]) ? number[i] - '0' : number[i] - 'A' + 10); value = value * bas + digit; } value *= sign; }
internal Bignum(IronMath.integer value): this() { this.value = value; }
internal Bignum(long value): this() { this.value = IronMath.integer.make(value); }