quiero hacer una división entre dos valores, que ha de devolver un valor con decimales. El caso es que no puedo utilizar el operador "/" ya que es de división entera. Veo en la ayuda que hay idiv pero no entiendo como va.
No entiendo muy bien tu problema, el operador / hace una división normal y corriente, si obtiene o no decimales únicamente depende de donde almacenes el valor de salida. En el ejemplo q das si "temperatura" la has definido como integer pues obtendrás un valor sin decimales, si la has definido como float pues tendrás decimales, no hay más secreto.
-- Saludos.
---------------------------------------- Quitar las XX para responder por mail.
¿Cómo has visto que es 0? ¿Visualizándolo por LCD? Ponme el programa completo. Es que me temo que sea algún error tonto de visualización de datos, porque tanto en C estándar como en CCS el operados / devuelve reales.
-- Saludos.
---------------------------------------- Quitar las XX para responder por mail.
En C, 16 y 20 son numeros enteros, 16 / 20 es una division entre enteros, y el resultado es 0.
Solo con que pongas 16.0 / 20, el compilador tendra que convertir el 20 entero a double, y realizar la divicion con decimales.
Debes vigilar el tipo de variables en las operaciones que se ejecutarán primero, en este caso (valor-c1), si uno de esos es double, ya todo el resto se irá convirtiendo a double.
Pero si por ejemplo valor,c1 y c2 son int, la division será una division entera y se perderan los decimales. Podrías hacer un cast:
temperatura = v1 + (((double)(valor-c1) / (c2-c1) ) * (v2-v1));
Así, si todas las variables son enteras, se ejecutan las restas operando con enteros (que no pierdes nada) y luego la division y la multiplicacion ya será en cama flotante.
De todas formas si vieras lo que está haciendo el compilador, no usarías varibales en punto flotante, usarías coma fija que es mucho más sencillo, y sabiendo el rango de valores que pueden tomar las variables, seguramente puedes simplificar la expresion mucho más. Por ejemplo, agrupas con paréntesis para que se ejecute la division antes que la multiplicacion, cuando seguramente haciendolo al revés tendrías mucha más precisión aún haciendolo con enteros (con double es igual, pero es que me parece una salvada usar double en un PIC).
Nuevamente mil gracias por tu tiempo, te comento, creo que he encontrado el error finalmente gracias a tu insistencia en que CCS devuelve un float con la operación de división */*
Resulta que declaro tal que así:
float n1,n2,n3;
n1 = 2/3; //_> Esto da como resultado CERO depurando con mplab.
pero si en lugar de hacer la división directamente hago:
n2 = 2; n3 = 3; n1 = n2 / n3; da 0,6, que es lo correcto..
cosa curiosa donde las haya..... el numerador y denominador han de ser variables float para que el resultado sea float. ¡no tenia ni idea!.
pd: dEPUraba con el mplab, aunque compilo con CCS.
¿A q te refieres con double? Pq en CCS no existe ese tipo de variable, para los reales lo único q hay es "float", q se representa en 32 bits, todos los demás tipos son enteros.
-- Saludos.
---------------------------------------- Quitar las XX para responder por mail.
bueno, aplicale lo mismo al float, el double es lo mismo pero con más precision. El CSS creo que trata de ser C, no conozco css pero te puedo dedir que con cualquier compilador de C habrías tenido el mismo problema.
Primero de todo, el operator/ tambi=E9n sirve para divisiones reales (te han respondido ya, solo ten=EDas que poner 16.0 / 20.0).
Por otro lado, si esto viene del post anterior del ADC y si no "recuerdo" mal, trabajas con un PIC16. Este no tiene divisi=F3n (ni real ni entera) y el CSS lo implementa por software. Como hablas de temperaturas y que un grado m=E1s o menos no te importa, puedes usar un entero de 16bits y "multiplicar por 100" los valores (trabajar con "centi-centigrados"). De esta forma puedes trabajar con divisiones y multiplicaciones de enteros que son m=E1s sencillas que las reales.
Tambi=E9n supongo que los valores c1, c2, v1 y v2 son constantes. Si es as=ED, lo tienes m=E1s facil porque solo tienes que multiplicar dos valores:
#define v1 valor #define v2 valor #define c1 valor #define c2 valor #define PROPx100 ( ((v2 - v1) * 100) / (c2 - c1) )
.=2E. temperatura =3D v1 * 100 + PROP * (valor - c1); /* esta en "centi-centigrados" */
PD: dudo que sea correcto centicentigrado, =BFc=F3mo se llamar=EDa a la cent=E9sima de grado?
umm... pues no lo sabía, yo en c programo solo C#, y esas cosas no mesuelen pasar ;)
un saludo, lo tendré en cuentra en el futuro. Aunque me sigue resultando curioso que tenga que meter un valor por pantalones en una variable float aunque sea un valor constante y conocido que no puedo poner directamente debido a esa restricción... un saludo!
Creo que "centésima de grado", al menos yo oigo todos los días hablar de "décimas de grado" y nunca de decigrados, supongo que para las centésima será lo mismo.
Lo correcto es "centigrado" , asi como la centesima parte del metro es "centimetro".
En la unica expresion que se utiliza es cuando se habla (mal) de "grados centigrados", que significa 'lectura en grados con precision al centigrado'.
Respecto de trabajar con un valor proporcional para no usar punto flotante, lo recomendable es usar el valor mas grande posible que no cause overflow, de manera que se minimicen los errores por redondeo. Como valor de la constante se elige lo que resulte mas comodo, se puede multiplicar por 100 (o por 1000 si no da overflow) y la lectura es 'casi' directa o por 256 u otro multiplo de 2, de manera que tanto multiplicacion como division sea un desplazamiento del registro (mas rapido).
Sobre lo lo que dices de 'limitacion' en el otro mensaje ... hereje ! a la hogera ! Es broma .. pero C es C.
Y sobre trabajar en coma fija, con dos decimales, en vez de poner float t = 25.35; usas int t = 2535;
siendo int de 16 bits (como se ponga en ccs, int o long, no se), tienes un rango mayor que +- 300 grados.
tu 'sabes' que tienes dos decimales, y todas las operaciones han de tenerlo en cuenta.
Si sumas dos temperaturas, que ambas usen el mismo numero de decimales (ej: 10.00 será 1000), es una suma de enteros y tienes una temperatura con el mismo numero de ceimales:
25.35 + 10.00 = 35.35; 2535 + 1000 = 3535;
Son cuatro instrucciones de código máquina trabajando con enteros, y un centenar (a ojo) haciendolo con coma flotante.
Si por casualidad tienes que multiplicar o dividir, tienes que tener en cuenta que el producto de dos numeros de dos decimales te da un numero de cuatro decimales
25.35 * 10.00 = 253.50 2535 * 1000 = 2535000 => divides por 100 y son 25350
En la division pasa al revés, por lo que puede ser necesario multiplicar por 100 el numeroador antes de dividir (así no pierdes los decimales, solo has de vigilar el overflow)
Otra alternativa, si al final los numeros han de salir por pantalla, consite en trabajar en bcd y coma fija, con lo cual la conversion a ascii es mucho más simple, y las operaciones no son mucho más complicadas (aunque dudo que las haga directamente el compilador, habría que buscar algun fuente por internés)
De todas formas si te cabe el programa en el PIC, y no resulta demasido lento, puesdes pasar de todo y usar float, pero es ques pics son tan limitados que me extraña que no se te quede pequeño a las primeras de cambio.
OK, gracias por la explicación tan exaustiva, meha quedado muy claro. Creo que mi mayor problema lo tengo con el lenguaje C, pero estoy en ello ;)
Respecto a la capacidad del programa.... No está finalizado aún y he ocupado un 46% de la memoria de código y un 9% de la ram. Creo que lo que me queda por codificar no llegará al 70%.
Creo que hablar de grados centígrados no es incorrecto, y no significa "lectura en grados con precisión al centigrado", sino "grados centígrados", equivalentes a grados Celsius.
Son dos palabras de escritura casi idéntica, pero con orígenes distintos. La palabra "centígrado", como sabrás, se debe a la forma en que se obtuvo inicialmente esa escala, dividiendo en 100 partes el rango de temperaturas desde el punto de congelación hasta el de ebullición del agua.
En cualquier caso, no digo que no sea correcto, que no lo sé, pero yo jamás he visto ni oído hablar de centigrados ni decigrados, sino de centésimas de grado y décimas de grado, cuando se habla de grados centígrados o Celsius. Probablemente, aún siendo correcto, los autores lo evitan para no dar lugar a equívocos.
--
Saludos de Jose Manuel Garcia
jose.mgg@terra.es
http://213.97.130.124
"Eduardo" escribió en el mensaje
news:1156433290.508304.269510@74g2000cwt.googlegroups.com...
Lo correcto es "centigrado" , asi como la centesima parte del metro es
"centimetro".
En la unica expresion que se utiliza es cuando se habla (mal) de
"grados centigrados", que significa 'lectura en grados con precision al
centigrado'.
Desde el punto de vista del idioma es correcto, son los prefijos que se agregan a la unidad (deci,centi,mili,micro,nano,pico,femto....). Con la temperatura no se acostumbra usar prefijo, no tiene mucho sentido porque el rango de variacion habitual son pocos ordenes de magnitud.
No te creas q son tan limitados... ¿recuerdas hace tiempo q me pasaste una página con unas fórmulas de psicrometría? Pues todas esas fórmulas pudieron ser implementadas en un 16F877 con variables float... y 16 Mhz iba sobradísimo de velocidad, tanto q tuve q ponerle rutinas de retardo para q los dígitos del LCD no variaran tan rápidamente.
-- Saludos.
---------------------------------------- Quitar las XX para responder por mail.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.