Cultura y divulgación
13 meneos
213 clics
Menos uno elevado a dos, igual a menos uno

Menos uno elevado a dos, igual a menos uno

En la implementación de .NET, la función matemática Math.Pow(-1, 2) devuelve -1 en lugar de 1.

| etiquetas: microsoft , matemáticas
11 2 1 K 117
11 2 1 K 117
"Math.Pow(-1, 2) returning -1 instead of 1 for some odd reason"

No me queda claro si ha hecho el juego de palabras aposta o le ha salido natural.
#2 Even he did on purpose, he won't tell :-D
#5 menos por menos es más, aquí o en el estado de Washington, con números enteros, racionales, reales o complejos. Así que, otra vez más, y contando, Microsoft la caga y echa balones fuera.
#7 Esa definición de "x multiplicado por si mismo y veces" es válida para enteros, pero no sirve en números reales. ¿Como haces para calcular bajo esa definición -1pi?
#17 Devolver -1 cuando el resultado es 1 no parece dentro de ningún margen de error aceptable.

Que ocurre si hace lo mismo en Java ?
#5 Como no van a estar definidas las potencias de números reales???
It's a feature!
#17 Y 1 no está "dentro del margen de error". Por qué "seria incorrecto"
#5 Creo que no has leído todo el comentario.
Pues como yo no tengo ni la más remota idea, voy a intentar no pontificar. A diferencia de otros.

Pero voy a hacer lo mismo que ese "otros", poner un enlace que no me he leído www.uv.es/gomezb/4Lajustificaciondeladeregla.pdf :-D
Es por el tipo de valor numérico.

Si ambos valores fuesen integer, habría devuelto 1, pero entonces la expresión debería indicarlo añadiendo el sufijo L a los valores numéricos para que entienda que estamos hablando de valores integer.

Por defecto los tomará como double, es decir, como valores numérico no enteros. Aunque en este caso los decimales sean 0, considerará que los argumentos no son valores enteros, sino valores reales cuya aproximación en el rango de error del tipo double arroja el…   » ver todo el comentario
#1 No
Los valores bajo math los toma como funciones matemáticas, no como double, aun Cuando fuese 1 + 1.Esto sirve para no tener que hacer eso que dices tu, que sería el especificar cada valor o símbolo.
Osease, el valor funcional de -1 está mal en alguna parte, puede ser como parte lógica o de memoria, perdiendo en algún punto información de esta variable.
#4 Los valores bajo math los toma como funciones matemáticas, no como double

Eso es irrelevante. Las funciones también tienen definido un tipo de salida. (x) => 4 no es la misma función si la salida se considera como integer que si la salida se considera como double. Al final lo que tienes es una pipe de datos y lo que importa es como considera los valores de entrada.

Y la función xy no es igual en números enteros que en numeros reales.
En números enteros, -12 es igual a 1.
En números reales, -12 no está definido.
#1

Para x^y en |R:

• Si x > 0, puedes calcular x^y para cualquier y.
• Si x < 0 y y es irracional, no está definido en |R
• Si x < 0 y y es fracción con denominador impar → sí está definido.
• Si y tiene denominador par → no está definido (a menos que pases a números complejos).

Así que -1^2 tienes x<1 y la potencia es una fracción con denominador impar (1, de 2/1), estando definido. .
#6 El problema es que en computación no puedes saber si un número es irracional, fracción con denominador par o fracción con denominador impar, ya que solo puedes acceder a un número reducido de valores decimales y solo con esa información podría ser cualquiera de los tres casos. Es decir, siempre habría de considerarse como no definido (para x<0).
#9 Si el problema es que "no esta definido" el resultado debe indicarlo, no devolver un valor erróneo.

Es una cagada se mire como se mire
#9 Por supuesto que lo sabes, ya que los lenguajes especifican el tipo de sus variables y valores. En lenguajes no tipados, se especifica como se almacenan los mismos.
#9 Estás muy valiente haciendo según qué afirmaciones:

- Los números cuya fracción en denominador es una potencia de 2 tienen representación exacta en coma flotante.
- Los que tienen factores primos distintos de 2 (como 5, 3, 7…) tienen representación periódica infinita en binario.

Llevas bastantes afirmaciones que no compruebas.

Edit:

int es_fraccion_binaria(double numero) {
const int max_iteraciones = 60; // Límite razonable por precisión
double parte_entera;
double fracc =…   » ver todo el comentario
#1 -1.0^2 sigue siendo 1.0
#12 El exponente también es double, es deci, que lo único que sabes es que es un valor cuya aproximación en precisión double es 2.

Es decir, el cálculo podría ser -12.0000000000000000005 (truncado a la precisión de los tipos), Y devolver el valor 1 para esa operación sería incorrecto.

Cuando devuelves un valor de un cálculo numérico, tienes que deolver un valor razonable para los valores dentro del rango de error del tipo de entrada.
#1 Devolver un valor erróneo NO es una solución.

menéame