round redondear quitar numeros hacia entre elevar ejemplos decimales cuadrado arriba javascript floating-point ieee-754 ecmascript-5 ecma262

javascript - redondear - Math.pow con números negativos y poderes no enteros



math.round javascript (2)

Supongo que porque esas circunstancias llevan el resultado a aguas complejas, y ECMAScript no está equipado con números imaginarios. Específicamente, su ejemplo debería dar como resultado algo cercano a 1 + 1.732i , entre otros resultados. (El hecho de que -2 es también un posible resultado es además del punto: es un accidente en lugar de una regla).

La especificación ECMAScript para Math.pow tiene la siguiente regla peculiar:

  • Si x <0 y x es finito e y es finito e y no es un entero, el resultado es NaN.

( http://es5.github.com/#x15.8.2.13 )

Como resultado Math.pow(-8, 1 / 3) da NaN lugar de -2

¿Cuál es el motivo de esta regla? ¿Hay algún tipo de ciencia informática más amplia o razón IEEEish para esta regla, o es solo una elección TC39 / Eich hecha una vez?

Actualizar

Gracias a los intercambios de Amadan conmigo, creo que entiendo el razonamiento ahora. Me gustaría ampliar nuestra discusión por el bien de la posteridad.

Tomemos el siguiente ejemplo: Math.pow(823543, 1 / 7) rinde 6.999999999999999 aunque realmente debería ser 7 . Esta es una imprecisión introducida por el hecho de que 0.14285714285714285 debe convertirse primero en una representación decimal 0.14285714285714285 , que se trunca y pierde precisión. Este no es un problema tan grave cuando trabajamos con números positivos porque aún obtenemos un resultado que está muy cerca del resultado real.

Sin embargo, una vez que entramos en el mundo negativo, tenemos un problema. Si un motor de JavaScript intentara calcular Math.pow(-823543, 1 / 7) , primero tendría que convertir Math.pow(-823543, 0.14285714285714285) en un decimal, por lo que realmente estaría calculando Math.pow(-823543, 0.14285714285714285) que en realidad no tiene una respuesta real . En este caso, puede tener que devolver NaN ya que no pudo encontrar un número real, aunque la respuesta real debería ser -7 . Además, buscar números complejos que estén cerca de los números reales para hacer una "mejor estimación" puede implicar un nivel de complejidad que no quisieron exigir que tuviera un motor JS en el campo de las matemáticas.

Supongo que es debido a la consideración de la pérdida de precisión en los números de punto flotante que los llevó a la regla de que los números negativos a una potencia no entera siempre deben ser NaN , básicamente porque una potencia no entera es probable que dé un número complejo como resultado de pérdida de precisión, incluso si no es así, y puede que no haya una buena forma de recuperarse de él.

Con esto, estoy bastante satisfecho, pero doy la bienvenida a más información.


Puedes usar una función auxiliar.

Rápidamente me enfrenté a una situación similar. Aquí hay una solución propuesta para ti

func checkSquareRoot(x: Double, y: Double) -> Double { let result = pow(x, y) if x > 0 { return result } else { return -1 * pow( -x, y) } }