javascript - operator - ¿Se pueden usar los operadores matemáticos*,/,+,-, ^ para convertir un número distinto de cero a 1?
operadores logicos jquery (4)
Una respuesta muy complicada, pero que no depende de una precisión limitada: si toma
x^(2**n)
, esto siempre será igual a
x+2**n
si x es cero, pero será igual a
x-2**n
si x tiene uno en el lugar n.
Por lo tanto, para x = 0,
(x^(2**n)-x+2**n)/(2**(n+1)
siempre será 1, pero a veces será cero para x! = 0 Entonces, si toma el producto de
(x^(2**n)-x+2**n)/(2**(n+1)
sobre toda n, luego XOR que con 1, obtendrá la Sin embargo, tendrá que codificar manualmente cada factor. Y tendrá que modificar esto si está usando puntos flotantes.
Si tiene el operador
==
, entonces
(x==0)^1
funciona.
Estoy trabajando con software (Oracle Siebel) que solo admite expresiones de JavaScript con operadores que se multiplican, dividen, restan, suman y XOR (
*
,
/
,
-
,
+
,
^
).
No tengo otros operadores como
!
o
? :
? :
disponible.
Usando los operadores anteriores, ¿es posible convertir un número a 1 si no es cero y dejarlo 0 si ya es cero? El número puede ser positivo, cero o negativo.
Ejemplo:
var c = 55;
var d; // d needs to set as 1
Intenté
c / c
, pero se evalúa a
NaN
cuando
c
es 0.
d
necesita ser 0 cuando
c
es 0.
c es un valor de moneda, y tendrá un máximo de dos dígitos finales y 12 dígitos iniciales.
Estoy tratando de emular una condición
if
al convertir un número a un 0 o 1 booleano, y luego multiplicar otras partes de la expresión.
Usa la expresión
n/n^0
.
Si
n
no es cero:
Step Explanation
------- -------------------------------------------------------------------------------
n/n^0 Original expression.
1^0 Any number divided by itself equals 1. Therefore n/n becomes 1.
1 1 xor 0 equals 1.
Si
n
es cero:
Step Explanation
------- -------------------------------------------------------------------------------
n/n^0 Original expression.
0/0^0 Since n is 0, n/n is 0/0.
NaN^0 Zero divided by zero is mathematically undefined. Therefore 0/0 becomes NaN.
0^0 In JavaScript, before any bitwise operation occurs, both operands are normalized.
This means NaN becomes 0.
0 0 xor 0 equals 0.
Como puede ver, todos los valores que no son cero se convierten a 1, y 0 se mantiene en 0. Esto aprovecha el hecho de que en JavaScript,
NaN^0
es 0.
Manifestación:
[0, 1, 19575, -1].forEach(n => console.log(`${n} becomes ${n/n^0}.`))
(((c/c)^c) - c) * (((c/c)^c) - c)
siempre devolverá 1 para negativos y positivos y 0 para 0.
Definitivamente es más confuso que la respuesta elegida y más larga. Sin embargo, siento que es menos intrépido y no depende de las constantes.
EDITAR: Como lo menciona @JosephSible, una versión más compacta de la mía y de @ CRice que no usa constantes es:
c/c^c-c
c / (c + 5e-324)
debería funcionar.
(La constante
5e-324
es
Number.MIN_VALUE
, el número positivo más pequeño que se puede representar). Si x es 0, eso es exactamente 0, y si x es distinto de cero (técnicamente, si x es al menos 4.45014771701440252e-308, que es el más pequeño) - el número cero permitido en la pregunta, 0.01, es), las matemáticas de coma flotante de JavaScript son demasiado imprecisas para que la respuesta sea diferente de 1, por lo que saldrá exactamente como 1.