Autor Tema: tipos de datos  (Leído 1350 veces)

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

Desconectado rodrigodedomingo

  • PIC10
  • *
  • Mensajes: 8
tipos de datos
« en: 05 de Noviembre de 2007, 15:49:28 »
Hola,

tengo un problema,creo que con los tipos de datos q estoy usando.Estoy recibiendo un dato por RS232 y tengo q hacer un cambio de variable antes de sacarlo por el puerto de salida del PIC.El cambio es y=201/93*x-48-32 y redondear el resultado al entero mas proximo pero no me va.
Estoy usando enteros para todo,q pasa cuando multiplicas un entero por un numero decimal y lo vuelcas en un entero otra vez?¿no se redondea el resultado automaticamente?¿como deberia hacer ese cambio de variable?

Muchas gracias,

Saludos.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: tipos de datos
« Respuesta #1 en: 05 de Noviembre de 2007, 16:45:45 »
Amigo Rodrigo:

Tenemos esta consulta sobre tu problema, también está esta consulta sobre el mismo problema, y por fin exactamente la misma consulta en este hilo donde estamos.

Te puedo asegurar que por mas veces que copies y pegues el mismo texto no vas a tener una respuesta.

Eso dependerá de los amigos que tengan los conocimientos adecuados, el tiempo necesario disponible o las ganas suficientes de hacerlo.

Ademas nuestras Reglas del Foro, que te aconsejo que te leas, indican claramente:

  • No repitas varias veces el mismo mensaje en distintos foros;

  • No insistas repetidamente en un tema para recibir respuestas. Sé paciente;

Por ello te pido lo que te piden las reglas, sé paciente.

Muchas gracias.



En cuanto a tu consulta ...

¿Que quieres decir que no te va? ¿No te redondea? ¿las variables X e Y tienen el tamaño suficiente para los valores que manejas (8,16,32 bits)? ¿Son enteros con signo o sin signo?

Si todas las variables son enteras y tienen el tamaño adecuado el resultado debe ser entero, redondeado (al entero mas próximo) o truncado (al entero inmediatamente inferior).

Una prueba que puedes hacer es cualificar (cast) los resultados que deseas obtener, por ejemplo:

y = (int8) 201/93 * x -48 -32;

O utilizar la división entera explícitamente declarada ...  (De la ayuda del CCS C)

DIV()
LDIV()

Syntax:
 idiv=div(num, denom)
 ldiv =ldiv(lnum, ldenom)
 idiv=ldiv(lnum, ldenom)
 
Parameters:
 num and denom are signed integers.
 num is the numerator and denom is the denominator.
 lnum and ldenom are signed longs.
 lnum  is the numerator and ldenom is the denominator.

Returns:
 idiv is an object of type div_t and lidiv is an object of type ldiv_t.  The div function returns a structure of type div_t, comprising of both the quotient and the remainder. The ldiv function returns a structure of type ldiv_t, comprising of both the quotient and the remainder.

Function:
 The div and ldiv function computes the quotient and remainder of the division of the numerator by the denominator. If the division is inexact, the resulting  quotient is the integer or long of lesser magnitude that is the nearest to the algebraic quotient. If the result cannot be represented, the behavior is undefined; otherwise quot*denom(ldenom)+rem shall equal num(lnum).

Availability:  All devices.


Y por último, también puedes hacer tu mismo la prueba dándole valores conocidos a X e Y, viendo los resultados después. Y cuando lo tengas claro posteas lo que hayas aprendido para que otros puedan utilizar el buscador del foro y encontrar soluciones a problemas similares.  :mrgreen:


« Última modificación: 05 de Noviembre de 2007, 17:04:34 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania