Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error en raíz cubica con pow()

Estas en el tema de Error en raíz cubica con pow() en el foro de PHP en Foros del Web. Quisiera hacer una raíz cubica y cogerme solo la parte entera. Algo sencillo ¿no? El problema esta al coger la parte entera. Código PHP: <?php ...
  #1 (permalink)  
Antiguo 31/07/2014, 09:53
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Error en raíz cubica con pow()

Quisiera hacer una raíz cubica y cogerme solo la parte entera. Algo sencillo ¿no?
El problema esta al coger la parte entera.
Código PHP:
<?php
for($i 1$i 10$i++){
    
$num1 pow($i3);
    
$num2 pow($num11/3);
    
$num3 intval($num2);
    echo 
"Inicial: $i -> Elevado a 3: $num1 -> POW: $num2 ->Raíz cúbica: $num3<br />";
}
?>
El código coge un numero, lo eleva al cubo y después le hace la raíz cubica.
Hasta hay todo muy bien.
Pero el código verdadero no genera el $num1 si no que puede ser cualquiera y el resultado final tiene que estar redondeado hacia abajo, es decir solo quiero la parte entera del numero.
Es por eso que tiene el intval, y también probé con floor pero el resultado es este (mirar el 5, 7 y 9):

Inicial: 1 -> Elevado a 3: 1 -> POW: 1 ->Raíz cúbica: 1
Inicial: 2 -> Elevado a 3: 8 -> POW: 2 ->Raíz cúbica: 2
Inicial: 3 -> Elevado a 3: 27 -> POW: 3 ->Raíz cúbica: 3
Inicial: 4 -> Elevado a 3: 64 -> POW: 4 ->Raíz cúbica: 4
Inicial: 5 -> Elevado a 3: 125 -> POW: 5 ->Raíz cúbica: 4
Inicial: 6 -> Elevado a 3: 216 -> POW: 6 ->Raíz cúbica: 6
Inicial: 7 -> Elevado a 3: 343 -> POW: 7 ->Raíz cúbica: 6
Inicial: 8 -> Elevado a 3: 512 -> POW: 8 ->Raíz cúbica: 8
Inicial: 9 -> Elevado a 3: 729 -> POW: 9 ->Raíz cúbica: 8
  #2 (permalink)  
Antiguo 31/07/2014, 14:05
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Error en raíz cubica con pow()

hace esto y mostranos el resultado.



<?
$num1 = pow($i, 3);
$num2 = pow($num1, 1/3);

var_dump($num2);

$num3 = intval($num2);
?>
  #3 (permalink)  
Antiguo 01/08/2014, 03:40
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: Error en raíz cubica con pow()

He completado un poquito mas la prueba...

Código PHP:
<?php
$i 
9;
$num1 pow($i3);
$num2 pow($num11/3);

echo 
'Num2: ';
var_dump($num2);

$num3 intval($num2);
echo 
'<br />Num3: ';
var_dump($num3);

$num4 9.0;
$num5 intval($num4);
echo 
'<br />Num4: ';
var_dump($num4);
echo 
'<br />Num5: ';
var_dump($num5);
?>

Resultado:

Num2: float(9)
Num3: int(8)
Num4: float(9)
Num5: int(9)

Gracias por contestar, espero poder solucionarlo.
  #4 (permalink)  
Antiguo 01/08/2014, 05:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en raíz cubica con pow()

¿No será que el problema es que trabajas con números de punto flotante, que son números por aproximación, y no de precisión?
En ese tipo de datos un 9 no es igual a 9,0000000000000.
¿lo sabías?
Especialmente cuando trabajas con decimales periódicos, este tipo de problemas suele aparecer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 01/08/2014, 05:37
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: Error en raíz cubica con pow()

Es un dato que no sabia y ha sido muy importante para dar con la solución.
Puede que no sea la mas eficiente pero funciona, se trata de pasarlo a texto y después otra vez a numero.
Probé con number_format pero me redondea el numero y el $num1_1 me lo hace mal.

Código PHP:
<?php
$i 
9;
$num1 pow($i3);
$num1_1 $num1 1;

$num2 pow($num11/3);
$num2_1 pow($num1_11/3);

$num3 $num2.'';
$num3_1 $num2_1.'';

$num3 *=1;
$num3_1 *=1;

echo 
'Num3: ';
var_dump(intval($num3));
echo 
'<br />';
echo 
'Num3_1: ';
var_dump(intval($num3_1));
?>

Resultado:

Num3: int(9)
Num3_1: int(8)

Gracias a todos.
  #6 (permalink)  
Antiguo 01/08/2014, 06:22
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Error en raíz cubica con pow()

no entiendo por que lo pasas a texto y despues lo multiplicas?
esto te funcionará de casualidad, cuando pruebes con numeros mas grandes lo mas seguro es que tengas problemas otra vez
  #7 (permalink)  
Antiguo 01/08/2014, 09:21
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: Error en raíz cubica con pow()

Lo hago por que lo probé por probar y funciono, también probé números grandes y también funciono. (el numero mas grande que necesito)
Lo que hago es pasarlo a texto y después pasarlo otra vez a numero ya que el pow me lo hace bien pero le mete algo raro al float y pasándolo a texto lo quita.
De momento esta solucionado pero si alguien tiene una forma mejor o es capaz de explicar mas exactamente donde esta el error y la solución correcta se lo agradeceré.

EDITO: Termine de probar y hasta $i =25909; lo hace bien, a mi no me hace falta tanto pero lo dicho, si alguien tiene una solución mejor la probare con gusto.
EDITO OTRA VEZ: Seguí probando y el motivo de que no pase del 25909 sin que de error esta en que el pow(25910, 3) te crea el numero 17394111071000 y al hacerle pow((17394111071000-1), 1/3) (cuando le resto uno me tendría que dar 25909,...) me devuelve el numero resultante redondeado hasta 9 decimales y al redondear este numero 25909,999999999503471799656025539 a noveno decimal pasa a 25910;
Para quien no lo a entendido:
Si hacen la raiz cubica de 17394111070999 con pow sale 25910 y con la calculadora sale 25909,999999999503471799656025539

Última edición por sekafry; 01/08/2014 a las 09:59

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:27.