Hoy los procesadores suelen llevar soporte para operaciones matemáticas en coma flotante, no obstante existen situaciones (y no necesariamente en aplicaciones de tiempo real) en las que es recomendable utilizar en una u otra forma algoritmos u operaciones en coma fija, al menos si se quiere conseguir optimizar el código para que se ejecute rápidamente.
Dado un número real x, se pueden encontrar múltiples (de hecho infinitas) representaciones para expresar su valor, algunos números especiales (Pi ~ 3.1415..., e ~ 2.7182...) tienen incluso nombre propio.
La representación de un número real no es ese número (de la misma forma que escribir Pedro no es esa persona), sin embargo para poder realizar operaciones, transmitir un resultado a otra persona o almacenarlo, es preciso que usemos algún tipo de representación; para almacenar y poder operar con números en un ordenador, debemos establecer una representación válida para los ordenadores.
En los albores de la electrónica, se implementaron algunos tipos de calculadoras electrónicas analógicas que se basaban en las propiedades físicas de los componentes electrónicos (una resistencia aporta linealidad, un diodo [una unión P-N] aporta una relación exponencial, la carga-descarga de un condensador inversión proporcional al tiempo de carga-descarga, etc...), la representación de los números se realizaba en base a magnitudes físicas (la tensión podría representar el valor del número o bien usando la corriente, la frecuencia, etc...) y las operaciones matemáticas, mediante las transformaciones de esas magnitudes a lo largo del circuito (divisor de tensión, amplificación, diferenciador, integrador, etc...).
Poseían la gran ventaja de que las operaciones se realizaban de forma inmediata (o como mucho dependiendo del circuito algún tiempo de estabilización), sin embargo, la precisión de las operaciones estaba condicionada por la tolerancia de los componentes utilizados (que es el error máximo entre el valor teórico de un componente y el valor físico real de ese componente, p.e. una resistencia que compras en la tienda como de 100 ohmios puede tener realmente 99.5 ohmios o 101.5 ohmios) pero además las condiciones ambientales afectan a los mismos (una barra de grafito de una determinada longitud y sección posee una resistencia diferente a diferentes temperaturas, presiones mecánicas, etc...).
Si la anterior desventaja ya es de por sí grande, todavía empeoraba las cosas el hecho de que debían planificarse meticulosamente el conjunto de operaciones a realizar, diseñar el circuito, calcular errores, etc... haciendo muy difícil el aprovechar el trabajo anterior realizado o almacenar de forma precisa esos valores (todos conocemos los discos de vinilo o las cintas magnéticas de los casset).
Por tanto, la electrónica analógica como plataforma para el cálculo matemático pronto quedó relegado a aplicaciones prácticas muy concretas (una muy sencilla es un regulador de la luz ambiental de una sala, por ejemplo).
Un ordenador maneja con seguridad valores que sólo contienen 1 o 0, no hay problemas de imprecisión y el almacenamiento siempre ha sido seguro (desde las tarjetas de cartón perforadas, un agujero representa un 1, mientras que si no hay agujero es un 0)
para almacenar datos se usan representaciones binarias (algo así como códigos morse). Para representar números naturales es fácil ver que se usará la base de numeración binaria (101 binario = 5 decimal) aunque lo habitual es que se establezca el número de bits (dígitos binarios) que se usarán para la representación (si usamos 8 bits sería 00000101 binario = 5 decimal), para números enteros en general igual, aunque normalmente los números negativos en complemento a 1 (se niegan todos los bits de la expresión y se suma 1, p.e. -5 es invertir todos los bits de 00000101 y queda 11111010 que sumado 1 da 11111011 binario = -5 decimal) la ventaja es que para operar con cualquier número sea éste positivo o negativo no debe hacerse nada especial (se suma como si todos fueran positivos).
Para la representación de números muy grandes precisaríamos de muchos bits, así por ejemplo, el Sol emite cada segundo unos 0,39 1034 ergios de tal forma que si quisieramos expresar este valor con bits, deberíamos usar 112 bits pero además, operar con todos ellos. En su lugar, se usa una representación similar a la notación científica, se reserva un bit para el signo, unos cuantos para la mantisa y otros pocos para el exponente que quedará sesgado (al valor almacenado se debe restar 2n-1 con n los bits del exponente), la mantisa normalmente se expresa de tal forma que su primer bit sea 1 (que no se almacena) y etc. más detalles en IEEE. La cuestión es que con sólo 32 bits almacenamos (con mucha menos precisión eso sí) cifras tan "grandes" como la anteriormente indicada.
Es una representación de números reales que permite realizar las operaciones "casi" tan rápido como con números enteros, tiene además la ventaja que las conversiones a y desde números naturales es "casi" inmediata aunque la desventaja de que el dominio de los valores representados es "estrecho" e "impreciso" frente a la notación científica (que con pocos bits una notación científica puede representar un amplio rango de valores con un amplio rango de precisiones p.e. desde -1040 hasta 1040 con un error inferior a 10-40).
Una representación en coma fija se basa en una representación de número natural en la que los valores reales han sido multiplicados por un factor antes de expresarlos como número natural. Lógicamente para recuperar el valor real, deberá dividirse por dicho factor. Así si prefijamos un factor de 1000, un valor real de 0,0034 será expresado como 0,0034 * 1000 = 3, se ve, que la precisión máxima está determinada directamente por el factor utilizado.
Puesto que cada valor lo hemos multiplicado por una constante, debemos tenerlo en cuenta a la hora de realizar las operaciones, que para las básicas tenemos (si a y b son números reales y f el factor de precisión usado, sea A = a · f y B = b · f):
Las operaciones anteriores, las podemos realizar las veces que sean menester, pero debemos tener en cuenta que:
Pues sólo debemos calcular la diferencia entre el valor obtenido y el que deberíamos haber obtenido, es decir, si tenemos en cuenta que el valor real a ha quedado truncado (hemos perdido "decimales") podemos expresar a = a1 + a2 (donde a1 es la parte expresada por el número entero A · f y a2 es el error cometido por el truncamiento), entonces: