[JS]整数除算-求商
9304 ワード
1.概要
最近JavaScriptでLeetcoeを解く最も見慣れない部分の一つが整数除算です
考えがなくてMath.floor
と書いたが、負数除算では動作と考えが違うconst a = -10
const b = 3
const res = Math.floor(a / b)
console.log('res', res) // -4
負数を落とすことはほとんどないので、一つ一つ見ると-10 = 3 * -3 + (-1)
몫: -3, 나머지: -1
したがって、-3が現れるはずです.
2. Math.floor
Math.floor-下降
MDNによると、함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.
ですから.Math.floor(-10/3)
は-4を返します.
正のタイミングで動きがいい.
3. Math.trunc
Math.trunc-破棄
整数部分のみが返されるため、整数と除数の重みを求めるのに適しています.Math.floor(-10/3)
は-3を返します.
4. ~~ (not not)
2つのビット非演算子を使用します.
MDNによれば、bitwise notを使用すると、xは−(x+1)を返し、すべての小数点を破棄する.
だから2回重ねて使うと小数点を放棄します// 3.5 -> -4 -> 3
const a = 3.5
console.log(~a) // -4
console.log(~~a) // 3
5.速度比較
1億回の演算を10回行い,クロムに大きな差はなかった.
1)クロム
const a = -10
const b = 3
const res = Math.floor(a / b)
console.log('res', res) // -4
-10 = 3 * -3 + (-1)
몫: -3, 나머지: -1
Math.floor-下降
MDNによると、
함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.
ですから.Math.floor(-10/3)
は-4を返します.正のタイミングで動きがいい.
3. Math.trunc
Math.trunc-破棄
整数部分のみが返されるため、整数と除数の重みを求めるのに適しています.Math.floor(-10/3)
は-3を返します.
4. ~~ (not not)
2つのビット非演算子を使用します.
MDNによれば、bitwise notを使用すると、xは−(x+1)を返し、すべての小数点を破棄する.
だから2回重ねて使うと小数点を放棄します// 3.5 -> -4 -> 3
const a = 3.5
console.log(~a) // -4
console.log(~~a) // 3
5.速度比較
1億回の演算を10回行い,クロムに大きな差はなかった.
1)クロム
2つのビット非演算子を使用します.
MDNによれば、bitwise notを使用すると、xは−(x+1)を返し、すべての小数点を破棄する.
だから2回重ねて使うと小数点を放棄します
// 3.5 -> -4 -> 3
const a = 3.5
console.log(~a) // -4
console.log(~~a) // 3
5.速度比較
1億回の演算を10回行い,クロムに大きな差はなかった.
1)クロム
2) safari
const a = 10000000000 // 100억
const b = 777777777 // 7억
const n = 100000000 // 1억
const testCase = 10
let timeSum = 0
for(let t=0; t<testCase; t++) {
const startTime = performance.now()
for(let i=0; i<n; i++) {
const res = Math.trunc(a/b)
// const res = ~~(a/b)
}
const endTime = performance.now()
timeSum += endTime - startTime
}
console.log(`평균 속도: ${timeSum / testCase} ms`)
6.数が多いですね
ジョー、ジョーン、海...1000年になると少しおかしくなりますconst a = 100000000000000000000000 // 천해
const b = 30
console.log('Math.floor', Math.floor(a/b)) // Math.floor 3.333333333333333e+21
console.log('Math.trunc', Math.trunc(a/b)) // Math.trunc 3.333333333333333e+21
console.log('not not', ~~(a/b)) // not not -435159040
7.個人的な意見
実際、ブラウザでは10回の除算演算はめったに行われません.
これらの演算をアルゴリズムまたは単純演算に限定すると、1兆回未満の演算に限定される.
速くて負数除算もサポートされている~~(not)
考えているだけです.
Pythonもmath.trunc
を使用して負数除算をサポートする必要があり、//
だけを使用しても問題ありません.
アルゴリズムを解くときはあまり負数除算がないようです.
しかし、機械が勉強するときは負数除算に注意しなければならない.
....
だからアルゴリズムを使うときに便利で、負数除算が必要ならそれをサポートしましょう.
リファレンス
https://codepen.io/supernova_at/post/javascript-s-double-bitwise-not-operator
https://www.delftstack.com/ko/howto/javascript/integer-division-javascript/
Reference
この問題について([JS]整数除算-求商), 我々は、より多くの情報をここで見つけました
https://velog.io/@skyepodium/JS-정수-나눗셈-몫-구하기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
const a = 100000000000000000000000 // 천해
const b = 30
console.log('Math.floor', Math.floor(a/b)) // Math.floor 3.333333333333333e+21
console.log('Math.trunc', Math.trunc(a/b)) // Math.trunc 3.333333333333333e+21
console.log('not not', ~~(a/b)) // not not -435159040
実際、ブラウザでは10回の除算演算はめったに行われません.
これらの演算をアルゴリズムまたは単純演算に限定すると、1兆回未満の演算に限定される.
速くて負数除算もサポートされている~~(not)
考えているだけです.
Pythonも
math.trunc
を使用して負数除算をサポートする必要があり、//
だけを使用しても問題ありません.アルゴリズムを解くときはあまり負数除算がないようです.
しかし、機械が勉強するときは負数除算に注意しなければならない.
....
だからアルゴリズムを使うときに便利で、負数除算が必要ならそれをサポートしましょう.
リファレンス
https://codepen.io/supernova_at/post/javascript-s-double-bitwise-not-operator
https://www.delftstack.com/ko/howto/javascript/integer-division-javascript/
Reference
この問題について([JS]整数除算-求商), 我々は、より多くの情報をここで見つけました
https://velog.io/@skyepodium/JS-정수-나눗셈-몫-구하기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について([JS]整数除算-求商), 我々は、より多くの情報をここで見つけました https://velog.io/@skyepodium/JS-정수-나눗셈-몫-구하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol