Autor Tema: Resolver problema con operación matemática  (Leído 2380 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Resolver problema con operación matemática
« en: 02 de Noviembre de 2021, 07:55:25 »
No se me ocurre ninguna operación matemática que pueda realizar lo mismo que este programa:

if (NumeroReal>0)
    return (NumeroReal);
else
    return (0)

El objetivo es que si el número es positivo, me quedo con él, pero si es negativo tengo que obtener un 0.

He estado dándole vueltas con multiplicaciones por -1, con valores absolutos, pero no encuentro la manera.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Resolver problema con operación matemática
« Respuesta #1 en: 02 de Noviembre de 2021, 08:01:45 »
Hola, en que IDE o compilador quieres hacerlo?
Conociendo el formato de la variable en dónde se aloja el valor. Sabemos que el bit más significativo es el signo. Por lo tanto si vale 1, deberás hacer igual a cero el valor del número.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Resolver problema con operación matemática
« Respuesta #2 en: 02 de Noviembre de 2021, 08:14:17 »
Me da igual el lenguaje. No quiero utilizar un condicional, porque eso ya lo tengo resuelto.
Mi pregunta es si se puede resolver con una operación matemática que no incluya condicionales.

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 573
Re:Resolver problema con operación matemática
« Respuesta #3 en: 02 de Noviembre de 2021, 08:36:34 »
Asi, rápido, se me ocurre:
(Número real + ABS(Número real))/2

Si es negativo, se anula el numerador y devuelve 0.
Si es positivo, se suman y se divide por dos, con lo que queda el valor original.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Resolver problema con operación matemática
« Respuesta #4 en: 02 de Noviembre de 2021, 08:43:02 »
¡Brillante!

Muchas gracias Fuente

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Resolver problema con operación matemática
« Respuesta #5 en: 02 de Noviembre de 2021, 09:24:30 »
Ingeniosa solución la que aportó fuente, pero puede haber un problema, pues si el núm. es mayor a la mitad del que la variable puede almacenar, al sumarlo dos veces, se desbordará!

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 573
Re:Resolver problema con operación matemática
« Respuesta #6 en: 02 de Noviembre de 2021, 10:23:24 »
Pues entonces:
(Número Real / 2) + (ABS (Número Real) / 2)

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Resolver problema con operación matemática
« Respuesta #7 en: 02 de Noviembre de 2021, 12:46:49 »
Pues entonces:
(Número Real / 2) + (ABS (Número Real) / 2)

Yo llegué a esa conclusión con un sistema de 2 ecuaciones con dos incógnitas:

xm + cte =x
 
(-x)m + cte = 0

Donde x es el número, m es una constante que se debe multiplicar al número y cte un valor que se debe sumar o restar al producto de xm.

Resolviendo este sistema tienes que cte = x/2 (donde X es su valor absoluto )y m = 1/2
« Última modificación: 02 de Noviembre de 2021, 12:54:38 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Resolver problema con operación matemática
« Respuesta #8 en: 02 de Noviembre de 2021, 14:51:53 »
No se me ocurre ninguna operación matemática que pueda realizar lo mismo que este programa:

if (NumeroReal>0)
    return (NumeroReal);
else
    return (0)

El objetivo es que si el número es positivo, me quedo con él, pero si es negativo tengo que obtener un 0.

He estado dándole vueltas con multiplicaciones por -1, con valores absolutos, pero no encuentro la manera.

No entiendo por qué lo querés implementar con operaciones mateméticas.  Si es una inquietud... perfecto!  Pero fuera de eso son puras desventajas pues las operaciones en punto flotante consumen mas recursos y demoran mucho mas que las enteras o lógicas.

A modo de ejemplo, cada línea hace lo mismo, pero una con un número positivo y la siguiente con uno negativo. 
A la derecha están los ciclos que demora cada una.
Código: [Seleccionar]
#include<18F4550.h>
#use delay(internal=4MHz)

float xn=-2.445 ,xp=34.23 , y1 ;

void main(void){

// Usando operaciones en punto flotante
// Cuantas mas sean... mas tiempo
    y1 = (xp+abs(xp))/2. ;            // 1157 ciclos
    y1 = (xn+abs(xn))/2. ;            //  217 ciclos

    y1 = (xp/2+abs(xp)/2) ;           // 2150 ciclos
    y1 = (xn/2+abs(xn)/2) ;           // 2118 ciclos

// Usando solo una multiplicacion
    y1 = xp*(xp>0) ;                  //  253 ciclos
    y1 = xn*(xn>0) ;                  //   96 ciclos

// Sin multiplicaciones ni sumas
    y1 = xp>0 ? xp : 0 ;              //   52 ciclos
    y1 = xn>0 ? xn : 0 ;              //   42 ciclos


// Eliminando todas las operaciones en punto flotante
// salvo la asignación
//
// El #define testea el bit de signo de la variable
// (formato Microchip)
#define GT0(x)   !(*(byte*)(&x+1)&0x80)

    y1 = GT0(xp) ? xp : 0 ;           //   24 ciclos
    y1 = GT0(xn) ? xn : 0 ;           //   19 ciclos

    if(GT0(xp)) y1=xp ; else y1=0 ;   //   16 ciclos
    if(GT0(xn)) y1=xn ; else y1=0 ;   //   14 ciclos

// Se el ajuste se debe hacer sobre la misma variable
// solamente hay que dejarla en 0 si es negativa
    if(!GT0(xp)) xp=0 ;               //   10 ciclos
    if(!GT0(xn)) xn=0 ;               //   13 ciclos

}
Salvo el #define que es medio críptico, el resto de las expresiones es igualmente legible.





Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Resolver problema con operación matemática
« Respuesta #9 en: 03 de Noviembre de 2021, 03:35:31 »
Pues lo necesitaba porque no podía meter una condición IF dentro de una cláusula SQL de InfluxDB.
La idea es representar en Grafana la energía que mis placas fotovoltaicas entregan a la red (excedente), pero no quiero que la gráfica dibuje la parte negativa, cuando mi consumo excede mi producción de energía.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Resolver problema con operación matemática
« Respuesta #10 en: 03 de Noviembre de 2021, 06:56:20 »
Por lo que vi InfluxDB tiene condicionales como if, y tambien otros como filter() que permite poner una condicion.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Resolver problema con operación matemática
« Respuesta #11 en: 03 de Noviembre de 2021, 14:08:15 »
¡Qué bueno!, pues no lo había investigado. Gracias Killer


 

anything