5 votos

Forma matemática de determinar si un número es un entero

Estoy desarrollando un programa de ordenador, y me he encontrado con un problema matemático. Esto no es específico de ningún lenguaje de programación, por lo que no es realmente apropiado preguntar en stackoverflow. ¿Existe alguna forma de determinar si un número es un entero mediante una función matemática, de la que se obtiene una respuesta booleana?

Por ejemplo:

que x sea igual a 159 que y sea igual a 12,5

f(x) devuelve 1 y f(y) devuelve 0

Por favor, contéstame si puedes. Si no es posible, ¿hay una forma similar de determinar si un número es impar o par?

EDITAR:

He encontrado una solución al problema que a Karolis Juodele. Usaré una función floor para redondear el entero hacia abajo, y luego restar la salida del número original. Si la salida es cero, entonces la función devuelve 0.

Sólo necesito asegurarme de que el suelo es una función puramente matemática. ¿Alguien lo sabe?

Gracias

9voto

Rakesh Puntos 108

Lo más básico que puedes hacer es comprobar si x=floor(x)x=floor(x) . Aquí floorfloor devuelve la parte entera de un número (redondea hacia abajo). Está presente en las bibliotecas estándar de la mayoría de los lenguajes.

8voto

411 Puntos 11

Definir

f(x)=e2πιxf(x)=e2πιx

Si f(x) para cualquier x dado es 1, entonces x es un número entero.

4voto

TheGeekGreek Puntos 1107

Ya que nadie ha contestado con esta discutible solución, la publicaré. f(x):={1xZ0xRZ es una función perfecta. Más corto aún sería χZ definido en R .

2voto

JoshL Puntos 290

Hay un error conceptual más fundamental en el problema, que proviene de no pensar en la forma en que los números se almacenan realmente en un ordenador moderno. La mayoría de los lenguajes de programación utilizan la doble precisión en coma flotante, en la que un número se almacena esencialmente como un entero con un número fijo de dígitos binarios multiplicado por una potencia de 2 .

Esto da lugar a todo tipo de errores de redondeo; uno de los principales objetivos del análisis numérico es comprenderlos y hacerles frente. El hecho de que esto requiera todo un subcampo de las matemáticas muestra lo difícil que puede ser el problema.

El tipo de error más básico es que el proceso de representación no es exacto. Por ejemplo, el número x=3.6 se almacena en realidad como aproximadamente x=3.60000000000000008882 y y=10(x3) se almacena en realidad como aproximadamente y=6.00000000000000088818.

Para verificar esto, o para ver lo que sucede en su propia combinación de ordenador/compilador, puede utilizar el siguiente programa en C.

#include <stdio.h>
#include <math.h>
int main() {
  double x = 3.6;
  printf("x %0.20f\n", x);
  double y = 10*(x - 3);
  printf("y %0.20f\n", y);
  double z = floor(y);
  if ( y == z ) { printf("yes\n"); } else {printf("no\n");}
  if ( y == 6.0 ) { printf("yes\n"); } else {printf("no\n");}
}

Ahora y debe ser un número entero, por supuesto - debería ser 6 . Pero el programa dirá "no" dos veces, porque la forma en que y no es la misma que la forma en que se almacena 6 se almacena. Casi siempre es un error comprobar si los números en coma flotante son exactamente iguales.

La forma más habitual de solucionar esto es utilizar un umbral de error y afirmar que dos números son iguales si están más cerca del umbral. Pero esto tiene sus propias complicaciones. Aquí hay tres de los muchos sitios web con más información.

0voto

Nash Read Puntos 13

Quiero añadir esta respuesta para aportar algo más matemático. También voy a simplificar el proceso utilizando los atajos disponibles en la programación. Todos los ejemplos que utilice serán de código Java, porque es el lenguaje más fácil para mí para explicarlo.

Es correcto decir que x es un entero si el 'floor(x)' es igual a x. Aunque esto es todo lo que se necesitaría en cualquier entorno informático, para demostrar que es matemático se requiere definir adecuadamente qué es realmente un 'floor':

Floor(x) = max { n ∈ Z | n ≤ x }

Para cualquiera que lea esto y se sienta mareado, básicamente significa que el "suelo" de un valor se encuentra recorriendo los enteros ( n ∈ Z ) dado que ( | ) ese entero es menor o igual que x. Y simplemente se busca el mayor (máximo) entero que satisface esto.

Puedes programar esto empezando en el valor entero 0, viendo si es mayor que 'x', y si no, incrementándolo en 1 y comprobando de nuevo. Cuando se ha encontrado el entero más grande, el booleano de la función es respondido por si dicho entero es igual a x. Por supuesto, si el valor que estás comprobando es negativo querrás cambiar esto.

Mira esto en Java, por ejemplo (un tipo de datos 'double' admite decimales; un 'int' no):

public static int floor(double x){

  int a = 0;

  while( a + 1 <= x ) a++; // (a++ is the same as 'a = a + 1')

  return a;

}

public static boolean isInteger(double x){

  return (Class.floor(x) == x);

}

Puedes citar todos los símbolos y demás al explicar las funciones, y así es como lo implementarías. El método por el que se obtiene una respuesta no es muy eficiente o útil para los números grandes, pero esto demuestra al menos que se puede hacer con las matemáticas intactas.

Esto no es relevante para el foro de Matemáticas, pero puede que te interese de todos modos. Al convertir un tipo de datos decimales a un tipo de datos enteros, el compilador normalmente 'baja' el decimal para obtener el valor entero. Para simplificar su código (y ahorrar mucho tiempo) puede querer introducir esto:

public static boolean cheatMethod(double x){

  return ((int)x == x);

}

Nota: esto no es matemáticamente sólido, ni es probable que funcione en todos los idiomas, ni es relevante para este foro. Está ahí porque es un método sencillo en general para comprobar si un número es un entero.

Citando el razonamiento que hay detrás de la función 'floor()' y adaptándola para números más grandes / negativos puedes demostrar que la función tiene un significado matemático. El cheatMethod() no te hará ganar puntos, pero también funcionará en algunos lenguajes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X