variable todas pasar llamar las insertar imprimir hacer etiquetas ejemplos desde como combinar codigo php math sign

todas - pasar variable php a html



¿Cómo obtener el signo de un número? (9)

¿Qué hay de malo con esta forma?

if ( $num < 0 ) { //negative } else if ( $num == 0 ) { //zero } else { //positive }

o ternario

$sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );

No está seguro del rendimiento de la comparación de valores de abs vs, pero podría usar:

$sign = $num ? $num / abs($num) : 0;

y podrías convertir cualquiera de ellos en una función:

function valueSign($num) { return $sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 ); //or return $sign = $num ? $num / abs($num) : 0; }

Supongo que podría estar hablando de gmp_cmp , al que podría llamar gmp_cmp( $num, 0 );

¿Hay una manera (simple) de obtener el "signo" de un número (entero) en PHP comparable a gmp_signDocs :

  • -1 negativo
  • 0 cero
  • 1 positivo

Recuerdo que hay algún tipo de función de comparación que puede hacer esto, pero no puedo encontrarlo en este momento.

Rápidamente compilé este ( Demo ) que hace el trabajo, pero tal vez hay algo más ingenioso (como una llamada de una sola función), me gustaría asignar el resultado en una matriz:

$numbers = array(-100, 0, 100); foreach($numbers as $number) { echo $number, '': '', $number ? abs($number) / $number : 0, "/n"; }

(este código podría encontrarse con problemas de precisión de punto flotante)

Relacionado: Solicitud # 19621 Math necesita una función "sign ()"


Aquí hay un artículo de primera línea que lo hará por usted de manera eficiente y confiable:

function sign($n) { return ($n > 0) - ($n < 0); }


Aquí hay uno sin bucle:

function sign($number){ echo $number, '': '', $number ? abs($number) / $number : 0, "/n"; } $numbers = array(-100, 0, 100); array_walk($numbers, ''sign'');


Creo que gmp_sign no es muy eficiente porque espera un GMP o una cadena. ($ n? abs ($ n) / $ n: 0) es matemáticamente correcto, pero la división cuesta tiempo. Las soluciones mín / máx parecen tener complejos innecesarios para flotadores.

($ n> 0) - ($ n <0) siempre hace 2 pruebas y una resta ($ n <0? -1: ($ n> 0? 1: 0) hace una o dos pruebas y no aritmética, debería sea ​​más eficiente, pero no creo que la diferencia sea relevante para la mayoría de los casos de uso.



Puedes anidar operadores ternarios:

echo $number, '': '', ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )

Esto no tiene ningún problema con la precisión de punto flotante y evita una división de punto flotante.


Sé que esto es tarde, pero ¿qué hay de simplemente dividir el número por el abs () de sí mismo?

Algo como:

function sign($n) { return $n/(abs($n)); }

Ponga cualquier manejo de errores que desee para div por cero.


Una variante de lo anterior en mi pregunta que probé y que también funciona y no tiene el problema de punto flotante:

min(1, max(-1, $number))

Edición: el código anterior tiene un defecto para los números flotantes (la pregunta era sobre números enteros) en el rango mayor que -1 y menor que 1 que se puede arreglar con el siguiente método:

min(1, max(-1, $number == 0 ? 0 : $number * INF))

Ese todavía tiene un defecto para el flotador NAN lo que siempre regresa -1 . Eso podría no ser correcto. En su lugar, uno podría querer devolver 0 también:

min(1, max(-1, (is_nan($number) or $number == 0) ? 0 : $number * INF))


Utilice strcmpDocs :

echo $number, '': '', strcmp($number, 0), "/n";