[JS]BigIntでMathが使えない件
2022-06-129 min read
目次
はじめに
JS の BigInt で Math を利用することはできません。
Math は Number 型のみ利用できます。
例えば以下のコードの場合、引数が BigInt のため実行に失敗します。
console.log(Math.abs(-1)); // 1
console.log(Math.abs(-1n)); // TypeError: Cannot convert a BigInt value to a number
それでも、abs とか max, min が利用できたらなと思っていたので、対策を考えてみました。
1. Math オブジェクトっぽいものを自前で実装する
Math オブジェクトっぽいものを自前で実装してみました。
BigInt では浮動小数点数は扱えないので、PI や 三角関数は除外しました。
const BigMath = {
abs(x) {
if (x < 0n) {
return -1n * x;
}
return x;
},
min(base, ...values) {
for (const value of values) {
if (value < base) {
base = value;
}
}
return base;
},
max(base, ...values) {
for (const value of values) {
if (value > base) {
base = value;
}
}
return base;
},
pow(base, ex) {
return base ** ex;
},
sign(x) {
if (x === 0n) {
return 0n;
}
return x < 0n ? -1n : 1n;
},
};
実行例
console.log(BigMath.max(1n, 2n, 3n)); // 3n
2. プロトタイプメソッドを追加してみる
イケてる実装ではないですが、プロトタイプメソッドを使う方法も思いつきました。
BigInt.prototype.abs = function() {
return -this;
};
BigInt.prototype.pow = function(ex) {
return this ** ex;
};
BigInt.prototype.min = function(...values) {
const base = this;
for (const value of values) {
if (value < base) {
base = value;
}
}
return base;
};
BigInt.prototype.max = function(...values) {
const base = this;
for (const value of values) {
if (value > base) {
base = value;
}
}
return base;
};
実行例
let x = BigInt(-2);
console.log(x.abs()); // 2n
console.log(x.pow(2n)); // 4n
console.log(x.max(-3n, -4n)); // -2n
Recommends
New Posts
Hot posts!
Date
Tags
(110)
(54)
(54)
(47)
(45)
(36)
(30)
(29)
(24)
(24)
(22)
(21)
(21)
(20)
(19)
(17)
(16)
(16)
(15)
(14)
(12)
(12)
(12)
(12)
(12)
(12)
(11)
(10)
(10)
(10)
(10)
(10)
(9)
(9)
(8)
(8)
(8)
(8)
(7)
(7)
(6)
(6)
(6)
(6)
(6)
(5)
(5)
(5)
(5)
(4)
Author