자바 펼쳐의 Number.sign ()
숫자 부호 ( signum 함수 ) 를 찾는 사소한 방법이 궁금하십니까 ?
명백한 것보다 짧거나 빠르거나 우아한 솔루션 일 수 있습니다.
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
짧은 발췌
사용하면 안전하고 빠 사용합니다.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
결과
지금은 다음과 같은 솔루션이 있습니다.
1. 명확하고 빠름
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. kbec 에서 수정 -한 가지 유형은 더 적고 성능이 괜찮고 짧게 [가장 빠름]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
주의 : sign("0") -> 1
2. 우아하고 짧고 빠르지 발생 [가장 느림]
function sign(x) { return x && x / Math.abs(x); }
주의 : sign(+-Infinity) -> NaN
,sign("0") -> NaN
현재 Infinity
JS의 법적 번호는 솔루션이 제거되지 않는 것입니다.
3. 예술 ...하지만 매우 느림 [가장 느림]
function sign(x) { return (x > 0) - (x < 0); }
4. 빠른 비트 시프트를 사용
하지만sign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. 형식 안전 [megafast]
! 브라우저 (크롬의 v8)가 약간의 마법 최적화를 수행하는 것처럼 보이며이 솔루션은 2 개의 추가 작업이 포함되어 있고 기능적으로 더 빠를 수 없음에도 불구하고 (1.1)보다 훨씬 더 성능이 뛰어난 기능입니다.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
도구
개선을 환영합니다!
[Offtopic] 수락 된 답변
Andrey Tarantsov- 예술에 +100이지만 슬프게도 명백한 접근 방식보다 약 5 배 느립니다.
Frédéric Hamidi- 어쩐지 가장 많이 찬성 된 답변 (글을 쓰는 동안) 그리고 다소 멋지지만, 일을 어떻게 해야하는지 확실히 아닙니다, imho. 또한 숫자이기도 한 무한대 숫자를 선택 처리하지 못합니다.
kbec- 명백한 솔루션의 개선입니다. 그다지 혁명적이지는 않지만 모두 종합하면 이이 가장 좋다고 생각합니다. 그를 위해 투표하십시오 :)
보다 우아한 버전의 빠른 솔루션 :
var sign = number?number<0?-1:1:0
숫자를 절대 값으로 나누면 부호도 제공됩니다. 단락 논리 AND 연산자를 사용하면 특수한 경우가 가능 0
합니다.
var sign = number && number / Math.abs(number);
찾고있는 함수는 signum 이며이를 구현하는 가장 좋은 방법은 다음과 같습니다.
function sgn(x) {
return (x > 0) - (x < 0);
}
JavaScript (ECMAScript)의 부호있는 0을 지원하지 않습니다. "megafast"는 0이 아닌 x를 반환 할 때 작동하는 것입니다.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;
}
따라서 ECMAScript의 Math.sign ( MDN ) 초안과 호환 됩니다.
x가 양수, 음수 또는 0인지 x의 부호를 반환합니다.
- x가 NaN이면 결과는 NaN입니다.
- x가 −0이면 결과는 −0입니다.
- x가 +0이면 결과는 +0입니다.
- x가 음수이고 −0이 아니면 결과는 −1입니다.
- x가 +0이 아니라 양수이면 결과는 +1입니다.
최신 브라우저에서 진행되는 작업에 관심이있는 사람들을 위해 ES6 버전에는 기본 Math.sign 메소드 가 있습니다. 여기 에서 지원을 확인할 수 있습니다 .
기본적으로 반환 -1
, 1
, 0
또는NaN
Math.sign(3); // 1
Math.sign(-3); // -1
Math.sign('-3'); // -1
Math.sign(0); // 0
Math.sign(-0); // -0
Math.sign(NaN); // NaN
Math.sign('foo'); // NaN
Math.sign(); // NaN
var sign = number >> 31 | -number >>> 31;
Infinity가 필요하지 않고 숫자가 openjdk-7 소스에서 찾을 수있는 정수라는 것을 아는 경우 초고속 : java.lang.Integer.signum()
재미를 위해 이것을 추가 할 것이라고 생각했습니다.
function sgn(x){
return 2*(x>0)-1;
}
0 및 NaN 반환 -1
+/- 무한대에서 잘 작동합니다.
모든 숫자, 0
및 및 및 및 -0
에서 작동하는 솔루션 은 다음 Infinity
과 -Infinity
같습니다.
function sign( number ) {
return 1 / number > 0 ? 1 : -1;
}
자세한 내용은 " +0과 -0이 같은가요? " 라는 질문 을 참조하십시오.
경고 : now 표준 Math.sign
을 포함하여 이러한 답변 중 어떤 것도 케이스 0
대 -0
. 이것은 문제가되지 않을 수 있지만 특정 물리 구현에서는 중요 할 수 있습니다.
숫자를 비트 시프트하고 MSB (Most Significant Bit)를 확인할 수 있습니다. MSB가 1이면 숫자는 음수입니다. 0이면 양수 (또는 0)입니다.
방금 똑같은 질문을하려고했지만 글을 쓰기 전에 해결책을 찾았고이 질문이 이미 존재하는 것을 보았지만이 해결책을 보지 못했습니다.
(n >> 31) + (n > 0)
삼항을 추가하면 더 빠른 것 같습니다. (n >> 31) + (n>0?1:0)
Martijn의 대답과 매우 유사합니다.
function sgn(x) {
isNaN(x) ? NaN : (x === 0 ? x : (x < 0 ? -1 : 1));
}
더 읽기 쉽습니다. 또한 (또는 귀하의 관점에 따라) 숫자로 해석 될 수있는 것들을 더럽 힙니다. 예를 들어, 그것은 반환 -1
되게 할 때 '-5'
.
-0과 0을 반환하는 실질적인 의미가 Math.sign
없으므로 내 버전은 다음과 같습니다.
function sign(x) {
x = Number(x);
if (isNaN(x)) {
return NaN;
}
if (x === -Infinity || 1 / x < 0) {
return -1;
}
return 1;
};
sign(100); // 1
sign(-100); // -1
sign(0); // 1
sign(-0); // -1
내가 아는 방법은 다음과 같습니다.
수학 부호 (n)
var s = Math.sign(n)
이것은 기본 함수이지만 함수 호출의 오버 헤드로 인해 가장 느립니다. 그러나 'NaN'을 처리합니다. 여기서 아래의 다른 항목은 0 (예 : Math.sign ( 'abc')이 NaN)이라고 가정합니다.
((n> 0)-(n <0))
var s = ((n>0) - (n<0));
이 경우 기호에 따라 왼쪽 또는 오른쪽 만 1이 될 수 있습니다. 결과적으로 1-0
(1), 0-1
(-1) 또는 0-0
(0)이됩니다.
이 속도는 Chrome에서 다음 속도와 함께 목과 목처럼 보입니다.
(n >> 31) | (!! n)
var s = (n>>31)|(!!n);
"부호 전파 오른쪽 시프트"를 사용합니다. 기본적으로 31만큼 시프트하면 부호를 제외한 모든 비트가 삭제됩니다. 부호가 설정되어 있으면 결과는 -1이고 그렇지 않으면 0입니다. 오른쪽 |
값을 부울로 변환하여 양수를 테스트합니다 (0 또는 1 [BTW :과 같은 숫자가 아닌 문자열 !!'abc'
은이 경우 0이됩니다. not NaN]) 그런 다음 비트 OR 연산을 사용하여 비트를 결합합니다.
이것은 브라우저 전체 에서 최고의 평균 성능으로 보이지만 (적어도 Chrome과 Firefox에서 최고), 모든 브라우저에서 가장 빠른 것은 아닙니다. 어떤 이유로 IE에서는 삼항 연산자가 더 빠릅니다.
n? n <0? -1 : 1 : 0
var s = n?n<0?-1:1:0;
어떤 이유로 IE에서 가장 빠릅니다.
jsPerf
수행 된 테스트 : https://jsperf.com/get-sign-from-value
내 두 센트, Math.sign과 동일한 결과를 반환하는 함수, 즉 sign (-0)-> -0, sign (-Infinity)-> -Infinity, sign (null)-> 0 , sign (undefined)-> NaN 등
function sign(x) {
return +(x > -x) || (x && -1) || +x;
}
Jsperf는 테스트 또는 개정판을 만들 수 없습니다. 테스트를 제공 할 수 없어서 죄송합니다 (jsbench.github.io를 시도했지만 결과는 Jsperf보다 훨씬 더 가깝습니다 ...)
누군가가 그것을 Jsperf 개정판에 추가 할 수 있다면 이전에 주어진 모든 솔루션과 어떻게 비교되는지 궁금합니다.
감사합니다!
짐.
편집 :
나는 다음과 같이 써야했다.
function sign(x) {
return +(x > -x) || (+x && -1) || +x;
}
( (+x && -1)
대신 (x && -1)
) 처리 sign('abc')
하려면 (-> NaN)
참고 URL : https://stackoverflow.com/questions/7624920/number-sign-in-javascript
'IT' 카테고리의 다른 글
ngModel 포맷터 및 파서 (0) | 2020.08.19 |
---|---|
SVG는 텍스트 요소 너비를 얻습니다. (0) | 2020.08.19 |
기술적으로 s3n, s3a 및 s3의 차이점은 무엇입니까? (0) | 2020.08.19 |
Pandas DataFrame에서 "Unnamed : 0"열을 제거하는 방법은 무엇입니까? (0) | 2020.08.19 |
배열 변수의 크기가 main에서와 동일하지 않은 이유는 무엇입니까? (0) | 2020.08.19 |