2012-08-17 9 views
7

Dado que las computadoras piensan en términos de "1" y "0", ¿cómo calculan y representan fracciones como 7.50? Sé Java y JavaScript y si es necesario para la respuesta, puede usarlos como ejemplo.¿Cómo se representan las fracciones en las computadoras?

Editar: yo estaba viendo este MIT video on hashing by Prof. Cormen en 46:31 segundos, explica la función de multiplicación de hash usando una rueda modular que es un círculo unitario con varios puntos en el mismo y los puntos denotan fracciones. Esto me llevó a hacer esta pregunta básica aquí en SO.

+0

[Aquí] (http://stackoverflow.com/questions/474535/best-way-to-represent-a-fraction-in-java) –

Respuesta

10

La forma más común de representar números que no sean enteros en las computadoras es mediante el uso de punto flotante, particularmente IEEE 754 coma flotante. Como puede estar familiarizado, los enteros se representan comúnmente mediante el uso de bits de hardware para representar números binarios, por lo que las propiedades físicas (como carga o falta de carga, alto voltaje o baja tensión, un campo magnético en una u otra dirección) se utilizan para representan bits (0 y 1), y una secuencia de esos bits hace un número (como 11010), que interpretamos en binario para representar un número (11010 es 16 + 8 + 2 = 26). No solemos pensar en ello, pero hay un "punto de base" a la derecha de este número: "11010". Solo necesitamos el punto de base cuando tenemos más bits a la derecha de él, que representan fracciones. Por ejemplo, 11010.11 es 16 + 8 + 2 + 1/2 + 1/4 = 26.75. Para cambiar de enteros a punto flotante, hacemos flotar el punto de base. Además de los bits que representan el número, tenemos algunos bits adicionales que nos dicen dónde colocar el punto de base.

Entonces, podríamos tener tres bits, digamos 010, para decir dónde va el punto de la base y otros bits, digamos 1101011, para representar el valor. Los bits de punto de base, 010, podrían decir que mueve el punto de base dos posiciones hacia la izquierda, cambiando "1101011." a "11010.11".

En IEEE 754 de precisión simple, hay un bit de signo (que nos dice + o -), ocho bits de exponente y 23 bits de valor (para el "significando" o "fracción"). Los valores 0 y 255 de los bits de exponente son especiales.Para otros valores de los bits de exponente, restamos 127 para obtener exponentes que van desde -126 (desplaza el punto de base 126 bits hacia la izquierda) hasta 127 (desplaza el punto de base 127 bits hacia la derecha). Los bits significativos se interpretan como un número binario, excepto que los modificamos un poco: escribimos "1", luego un punto de base, luego los 23 bits del significado, por lo que tenemos algo así como "1.1101011000 ...". Como alternativa, puede pensar en esto como un entero: "1" y luego 23 bits sin punto de base insertado, formando un número binario de 24 bits, pero el exponente se ajusta con un valor adicional de 23 (resta 150 en lugar de 127) .

En doble precisión IEEE 754, hay un bit de signo, 11 bits de exponente y 52 bits de referencia.

Existen otros formatos de punto flotante, que son menos comunes. Algunos más antiguos usan hexadecimal como base (usando el exponente para indicar cambios de cuatro bits en lugar de uno). Un tipo importante de formato de coma flotante es decimal, donde el exponente indica potencias de 10. En punto flotante decimal, el significado puede ser un número entero binario o puede ser un número decimal codificado en binario (donde cada cuatro bits indica un dígito decimal) o puede ser un híbrido (se usan grupos de bits para indicar un número pequeño de dígitos decimales según un esquema personalizado).

Una propiedad importante de los números de coma flotante es que no pueden representar todos los números reales (incluso en un rango finito, por supuesto) o incluso todos los números racionales. Esto obliga a las operaciones matemáticas a devolver resultados redondeados a números representables, lo que causa un sinfín de problemas para las personas que no están familiarizadas con el trabajo con punto flotante. Esta propiedad a su vez se convierte en una característica del punto flotante decimal: es buena para trabajar con denominaciones de moneda y otros números asociados con humanos que generalmente se manipulan en decimales, porque la mayoría de los errores de redondeo se pueden eliminar mediante el uso cuidadoso del punto flotante decimal. Los científicos y matemáticos, que trabajan más con números naturales o asociados a la naturaleza en lugar de números contaminados por humanos, tienden a preferir el punto flotante binario, porque está más ampliamente disponible y está bien soportado por el hardware.

Existen otras formas de representar números no enteros en las computadoras. Otro método común es el punto fijo. En punto fijo, una secuencia de bits, como 1101011, se interpreta con un punto de base en una posición fija conocida. La posición se fijaría en una posición útil para una aplicación específica. Por lo tanto, los bits 1101011 podrían representar el número 11010.11 . Una ventaja del punto fijo es que se implementa fácilmente con hardware estándar. Para agregar dos números de punto fijo, simplemente los agregamos como si fueran enteros. Para multiplicar dos números de punto fijo, los multiplicamos como si fueran enteros, pero el resultado tiene el doble de posiciones después del punto de base, por lo que cambiamos los bits para ajustarlo o escribimos nuestro código para que los resultados de tales operaciones se interpretan con el número conocido de bits después del punto de base. Algunos procesadores tienen instrucciones para admitir punto fijo ajustando multiplicaciones para este efecto.

Los números también se pueden escalar a enteros. Por ejemplo, para trabajar con la moneda de los Estados Unidos, simplemente multiplicamos los montos en dólares por 100 y hacemos toda la aritmética con enteros. El punto de base solo se inserta al mostrar los resultados finales (y se interpreta al leer datos de humanos). Otra escala común es representar las intensidades de píxeles (de 0 a 1) multiplicando por 255, de modo que las fracciones de 0 a 1 encajen en un byte de ocho bits.

También hay software para proporcionar precisión extendida (use varias unidades del tipo aritmético básico para proporcionar precisión adicional) o precisión arbitraria (use un número dinámico de unidades para proporcionar tanta precisión como desee). Este tipo de software es muy lento en comparación con la aritmética soportada por hardware y, por lo general, se usa solo para fines especiales. Además, la precisión extendida tiene esencialmente las mismas propiedades que el punto flotante; es solo que los errores de redondeo son más pequeños, no desaparecen. La precisión arbitraria tiene el mismo defecto, excepto que su precisión dinámica puede permitirle cometer un error lo suficientemente pequeño como para que pueda obtener un resultado final dentro de un intervalo necesario (con la prueba de que lo ha hecho).

Otra forma de representar no enteros es mediante el uso de fracciones. Puede almacenar un numerador y un denominador, y realizar operaciones aritméticas de la misma manera que se enseña en la escuela: Multiplique multiplicando numeradores y multiplicando denominadores. Agregue convirtiendo ambas fracciones para tener un denominador común, luego agregue numeradores. Este tipo de aritmética es problemática porque los denominadores se vuelven muy grandes rápidamente, por lo que necesita una precisión ampliada o una precisión arbitraria para gestionarlos.

También puede representar números simbólicamente o con expresiones compuestas. Por ejemplo, en lugar de almacenar la raíz cuadrada de dos como un valor numérico, puede almacenarla con una estructura de datos que represente la operación de raíz cuadrada aplicada al número 2. Para realizar cualquier otra operación que no sea la más simple con tales representaciones se requiere un software muy complicado para gestionar expresiones, combinarlas, encontrar reducciones, etc. Este tipo de representación se usa en software matemático especializado, como Maple y Mathematica.

Finalmente, puede representar los números de la forma que desee. Nuestros procesadores modernos son dispositivos informáticos de uso general, hasta los límites de su velocidad y capacidad de almacenamiento, por lo que puede escribir algoritmos que representan números con cadenas o estructuras de datos o cualquier otra técnica.

+4

Hola amigo, esto es Stack Overflow. La Encyclopaedia Britannica es el siguiente edificio;) –

+3

Me molesta que obtuviera 2e-2 votos por byte para ese comentario, y solo obtuve 4.3e-4 para la respuesta. –

+0

@EricPostpischil puede explicar Los valores 0 y 255 de los bits de exponente son especiales. Para otros valores de los bits de exponente, restamos 127 para obtener exponentes que van desde -126 (desplaza el punto de base 126 bits hacia la izquierda) hasta 127 (desplaza el punto de base 127 bits hacia la derecha). ¿No dijiste que ese MSB es el bit de signo? ¿Qué significa un exponente negativo? – Geek

3

Es un tema enormemente complejo y puede requerir hardware especializado dependiendo del tamaño de la precisión involucrada.

La respuesta muy básica es que es poco variable hacha - divide 3 maneras -

Por ejemplo, una de 32 bits FP sería:

1 bit for the sign (-/+) 

8 bits for the exponent (power) of 10 

23 bits for the significant numbers. 

Piense en Excel cuando se puso una enorme FP en una celda y hace algo así como 1.23E-01 - lo que esto significa es 1.23 multiplicado por 10 a la potencia -1 - en otros términos 0.123.

Así que en binario sería: 01000000011110110000000000000000

Analizado:

0 = sign bit - positive 

010000000 - exponent - one (edit: first bit is sign bit of exponent) 

11110110000000000000000 - signifant figures of 123 

De todas formas esto es realmente difícil y mi binaria es oxidado por lo que alguien por favor, corregir errores.

+0

+1 por darme la intuición. Esto es exactamente lo que quería, no un enlace de wikipedia imaginable casi ilegible en el punto flotante IEEE. – Geek

+0

no hay problemas - perdón por el enlace;) – Dan

Cuestiones relacionadas