Pracuję z oprogramowaniem (Oracle Siebel), który obsługuje tylko wyrażeń JavaScript z operatorami mnożenie, dzielenie, odejmowanie, dodawanie i XOR ( *
, /
, -
, +
, ^
). Nie mam innych operatorów, takich jak !
lub ? :
dostępnych.
Czy za pomocą powyższych operatorów można przekonwertować liczbę na 1, jeśli jest różna od zera, i pozostawić ją na 0, jeśli jest już zero? Liczba może być dodatnia, zerowa lub ujemna.
Przykład:
var c = 55;
var d; // d needs to set as 1
Próbowałem c / c
, ale oblicza, NaN
kiedy c
wynosi 0. d
Musi być 0, kiedy c
wynosi 0.
c to wartość waluty, która może mieć maksymalnie dwie cyfry końcowe i 12 cyfr wiodących.
Próbuję emulować if
warunek, konwertując liczbę na wartość logiczną 0 lub 1, a następnie mnożąc inne części wyrażenia.
javascript
siebel
dave
źródło
źródło
Odpowiedzi:
c / (c + 5e-324)
powinno działać. (Stała5e-324
toNumber.MIN_VALUE
najmniejsza reprezentowalna liczba dodatnia.) Jeśli x jest równe 0, to jest dokładnie 0, a jeśli x jest różne od zera (technicznie rzecz biorąc, jeśli x wynosi co najmniej 4,45014771701440252e-308, czyli najmniejszą dopuszczalną liczbą niezerową w pytanie, 0,01, jest), obliczenia zmiennoprzecinkowe JavaScript są zbyt nieprecyzyjne, aby odpowiedź była inna niż 1, więc wyjdzie jako dokładnie 1.źródło
other parts of the expression
ic / (c + 5e-324) * some_expression
nie zadziałaNumber(Boolean(n))
bez operatora. Nie powiedziałem, że nie jest to odpowiedź, której szukał PO, ale to nie jest odpowiedź na pytanie, które opisał PO. Prawdopodobnie powinno to poprawić pytanie.Użyj wyrażenia
n/n^0
.Jeśli
n
nie jest zerem:Jeśli
n
wynosi zero:Jak widać, wszystkie niezerowe wartości są konwertowane na 1, a 0 pozostaje na 0. Wykorzystuje to fakt, że w JavaScript,
NaN^0
wynosi 0.Próbny:
źródło
Number.NaN ^ n === n
o_O (gdzien
jest liczbą skończoną)NaN
jest dogodnie konwertowany na zero. Zobacz: Operacje bitowe na liczbach innych niż liczby~~NaN === 0
wydaje się bardziej naturalne**
), jest to bitowy XOR. Operacje bitowe mają bardzo niski priorytet w javascript, więc podział nastąpi najpierw.^
jest bitowym operatorem xor. Wątpię, czy^
w OP jest bitowe xor, gdy wszystkie inne operatory są operatorami arytmetycznymi. Prawdopodobnie jest to operator potęgowania (**
w JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
zawsze zwróci 1 dla negatywów i pozytywów, a 0 dla 0.Jest zdecydowanie bardziej zagmatwana niż wybrana odpowiedź i dłuższa. Jednak wydaje mi się, że jest mniej hakerski i nie opiera się na stałych.
EDYCJA: Jak wspomina @JosephSible, bardziej kompaktowa wersja mojej i @ CRice, która nie używa stałych, to:
źródło
c/c^(c-c)
jest po prostuc
^
jako potęgowanie, jak sugeruje OP „mnożenie, dzielenie, odejmowanie, dodawanie i wykładnik (*, /, -, +, ^ )”. Jeśli^
jest XOR z pierwszeństwem JavaScript, to się mylę. Poprosiłem o wyjaśnienie w sprawie PO.Bardzo skomplikowana odpowiedź, ale nie zależy od ograniczonej precyzji: jeśli weźmiesz
x^(2**n)
, zawsze będzie równe,x+2**n
jeśli x będzie równe zero, ale będzie równe,x-2**n
jeśli x ma jedynkę na n-tym miejscu. Zatem dla x = 0,(x^(2**n)-x+2**n)/(2**(n+1)
zawsze będzie wynosić 1, ale czasami będzie wynosić zero dla x! = 0. Więc jeśli weźmiesz produkt(x^(2**n)-x+2**n)/(2**(n+1)
po wszystkich n, a następnie XOR to z 1, otrzymasz pożądaną funkcję. Musisz jednak ręcznie zakodować każdy czynnik. Będziesz musiał to zmodyfikować, jeśli używasz punktów zmiennoprzecinkowych.Jeśli masz
==
operatora, to(x==0)^1
działa.źródło
**
ani nie==
jest dostępne.