Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сократить x > 0 ? 1 : (x < 0 ? -1 : 0) (https://javascript.ru/forum/misc/41037-kak-sokratit-x-0-1-x-0-1-0-a.html)

danik.js 29.08.2013 09:16

Как сократить x > 0 ? 1 : (x < 0 ? -1 : 0)
 
В F# есть для этого функция Math.sign(x).
Функция должна работать так:

function sign(x) {
    if (x > 0)
        return +1;
    if (x < 0)
        return -1;
    return 0;
}

ruslan_mart 29.08.2013 10:28

danik.js, можно так :)

function sign(x) {
   return x/Math.abs(x)|0;
}


Или так:

function sign(x) {
   return x < 0 ? -1 : +!!x;
}

tenshi 29.08.2013 18:44

function sign(x){
    return x && ( x >> 31 ) * 2 + 1
}

animhotep 29.08.2013 18:51

магийа)

BallsShaped 29.08.2013 19:38

tenshi, почему не return x && ( x >> 31 || 1 )? Разве нельзя обойтись без арифметических операций?

danik.js 30.08.2013 05:02

Вариант с Math.abs отличный. А зачем там |0 ?

Riim 30.08.2013 05:28

Одного не понимаю - зачем???

danik.js 30.08.2013 05:54

Riim, что зачем?
На входе получаем некое число, положительное, 0 или отрицательное, на выходе нужно иметь +1, 0 или -1

danik.js 30.08.2013 06:22

Хотя вроде бы мне это действительно не нужно )
Я мучаюсь с событием WheelEvent. Мне нужно кроссбраузерно получать значение дельт при прокрутке.

Riim 30.08.2013 09:43

Цитата:

Сообщение от danik.js
что зачем?

зачем сокращать? Чем плох нормальный вариант записи?

Deff 30.08.2013 10:28

var x =2000000
x = parseInt(2*x/(Math.abs(x)+0.00001));
alert(x)

КЛ@ВИШ_nick 30.08.2013 11:58

Цитата:

Сообщение от danik.js
Вариант с Math.abs отличный. А зачем там |0 ?

Что будет при делении на 0?
Пример без |0
function sign(x) {
    return x/Math.abs(x) ;
}
alert(sign(0)) ;

PeaceCoder 30.08.2013 12:39

Вспоминаем математику. Знаком + является и число 0. Так же оно и является отрицательным. Но в математике это опускают. Так что
sign = x<0 ? -1:1;

ruslan_mart 30.08.2013 13:33

Цитата:

Сообщение от danik.js
А зачем там |0 ?

Ну там просто когда делишь 0 на abs(0), то получается NaN, поэтому так написал. :)

Вот так для понятности:

Math.sign = function(x) {
   return x / abs(x) || 0;
}

Riim 30.08.2013 13:42

Цитата:

Сообщение от PeaceCoder
Знаком + является и число 0. Так же оно и является отрицательным.

в js есть отрицательный 0.
Цитата:

Сообщение от PeaceCoder
sign = x<0 ? -1:1;

здесь он не учтен.

danik.js 30.08.2013 16:22

Цитата:

Сообщение от КЛ@ВИШ_nick
Пример без |0

Блин, точно. Самооценка -= 100500

Цитата:

Сообщение от Riim
в js есть отрицательный 0.

И как он выглядит?

animhotep 30.08.2013 16:50

консоли всё равно вроде
0===-0 //true

Riim 30.08.2013 17:23

Цитата:

Сообщение от danik.js
И как он выглядит?

большинство операций приводят его к +0.
Отличить от +0 можно так:
0 === -0;// true
1/0 === 1/-0;// false


В es6 будет Object.is (по сути вот это http://es5.javascript.ru/x9.html#x9.12), который так же будет их различать:
Object.is(0, -0);// false

animhotep 30.08.2013 17:41

дык при делении на 0 бесконечность будет а не 0
а у бесконечности да, есть знак

tenshi 01.09.2013 13:29

Я вот чего понять не могу - зачем изобретать свою математику?

Riim 01.09.2013 14:59

tenshi,
а кто ее изобретает?

tenshi 01.09.2013 22:00

Инженера, что придумали отрицательный ноль и бесконечность как частное от деления на ноль

simple 01.09.2013 22:46

Math.sign = function (n) {
    if (n < 0) return -1;
    if (n > 0) return 1;
    return 0;
};

Условием получается быстрее чем через объект Math.
http://jsperf.com/math-sign

danik.js 02.09.2013 05:35

Цитата:

Сообщение от tenshi
Инженера, что придумали отрицательный ноль и бесконечность как частное от деления на ноль

Ничего инжерены не придумывали. Это математика. Поэтому твое возмущение выглядит глупо.

danik.js 02.09.2013 05:38

Цитата:

Сообщение от simple
Условием получается быстрее чем через объект Math.

Серьезной разницы нет. И else там нафиг не нужны.

tenshi 02.09.2013 16:44

Цитата:

Сообщение от danik.js (Сообщение 270431)
Ничего инжерены не придумывали. Это математика. Поэтому твое возмущение выглядит глупо.

Не смущает, что по ссылкам речь идёт о последовательностях, а не о числах?


Часовой пояс GMT +3, время: 19:41.