miércoles, 29 de enero de 2020

Representación de las razones trigonométricas en la circunferencia de referencia

Expresión de un número decimal en binario

ENUNCIADO. Exprésese en base $2$ el número $13,3$ (que viene dado en base $10$), conservando en la representación finita $23$ bits en la parte fraccionaria.

SOLUCIÓN. La parte entera, $13$, es igual a $1101_{2}$; en efecto, dividiendo sucesivamente por $2$ ( que es el número de símbolos del alfabeto de numeración binario ) el número en cuestión, y teniendo en cuenta el teorema de la división entera, al llevar a cabo las divisiones sucesivas de $13$ entre $2$:
$13=6 \cdot 2+\textbf{1}$
$6=3\cdot 2+\textbf{0}$
$3=\textbf{1}\cdot 2+\textbf{1}$
hasta llegar a una división con resto cero - en este caso, la tercera -, tomamos el bit menos significativa como el valor del último cociente, seguido por el bit que corresponde al resto de dicha división, y, así, siguiendo con las divisiones anteriores hasta obtener el bit más significativo, que corresponde al resto de la primera división. En efecto, al escribir el número en forma desarrollada, $1\cdot 2^3+1\cdot 2^2+0\cdot 2^1+ 1\cdot 2^0$, vemos que dicha suma, $8+4+1$, es igual a $13_{10}$

Ocupémonos ahora de la parte fraccionaria (decimal):
$0.3\cdot 2 = 0.6 \rightarrow 0$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--\,
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$0.8\cdot 2 = 1.6 \rightarrow 1$
$0.6\cdot 2 = 1.2 \rightarrow 1$
--
$0.2\cdot 2 = 0.4 \rightarrow 0$
$0.4\cdot 2 = 0.8 \rightarrow 0$
$\vdots$
y, así, indefinidamente, por lo que la parte fraccionaria consta de infinitos bits ( unos y ceros ), con periodicidad $1100$ a partir del quinto bit de la partea fraccionaria. Así, pues, $13,3_{10}=1101.0100\,1100\,1100\,1100\,\ldots_{2}$
Como hay infinitos bits en la parte fraccionaria, tenemos que quedarnos con un número finito de ellos para poder representar dicha cantidad en los registros de memoria de un computador ( que, obviamente, tienen longitud finita ); pongamos que cortamos el bit vigésimo tercero de la parte fraccionaria, entonces:
$13,3_{10}=1101.\,0100\,1100\,1100\,1100\,1100\,1100\ldots_{2} \approx$
$\approx 1101.\,0100\,1100\,1100\,1100\,1100\,110_{2}$
El valor ( en base $10$ ) que corresponde a esta representación finita es
$1\cdot 2^3+1\cdot 2^2+0\cdot 2^1+1\cdot 2^0 + 0\cdot 2^{-1}+1\cdot 2^{-2}+0\cdot 2^{-3}+0\cdot 2^{-4}+\ldots+0\cdot 2^{-23}=$
$=2^3+2^2+1+2^{-2}+2^{-5}+2^{-6}+2^{-9}+2^{-10}+2^{-13}+2^{-14}+2^{-17}+2^{-18}+2^{-21}+2^{-22}$
$=13,2999\,9995\neq 13$
Observemos que el error absoluto de la aproximación ( por representación finita ) es igual a $$|13,3-13,2999\,9995|=0,0000\,0005$$
(esto es, de $5\times 10^{-8}$), luego el error relativo es igual a $$\dfrac{5\times 10^{-8}}{13,3}\approx 4\times 10^{-9}=4\times 10^{-7}\,\%$$
$\square$

martes, 28 de enero de 2020

Cómo expresar en el sistema de numeración binario la parte fraccionaria de un número dado en el sistema de numeració decimal

En otras entradas del blog ya hemos hablado de cómo expresar en el sistema binario ( con unos y ceros, que es su expresión en el lenguaje máquina ) un número entero que venga dado en el sistema de numeración decimal. Consideremos por ejemplo el número $11_{10}$ ( en base $10$ ), resultando que $11_{10}=1011_{2}$ (en base binaria o base $2$, con tan sólo los símbolos $\{0,1\}$, a los que denominamos bits.

Ésto es así porqué, dividiendo sucesivamente por $2$ ( que es el número de símbolos del alfabeto de numeración binario ) el número en cuestión, y teniendo en cuenta el teorema de la división entera, al llevar a cabo las divisiones sucesivas de $11$ entre $2$:
$11=5 \cdot 2+\textbf{1}$
$5=2\cdot 2+\textbf{1}$
$2=\textbf{1}\cdot 2+\textbf{0}$
hasta llegar a una división con resto cero - en este caso, la tercera -, tomamos el bit menos significativa como el valor del último cociente, seguido por el bit que corresponde al resto de dicha división, y, así, siguiendo con las divisiones anteriores hasta obtener el bit más significativo, que corresponde al resto de la primera división. En efecto, al escribir el número en forma desarrollada, $1\cdot 2^3+0\cdot 2^2+1\cdot 2^1+ 1\cdot 2^0$, vemos que dicha suma, $8+2+1$, es igual a $11_{10}$

-oOo-

Ya sabemos hacer lo anterior; sin embargo, nos interesa también aprender a expresar en base binaria la parte fraccionaria de un número que viene dado en base diez. Consideremos pues la parte fraccionaria de un número dado en el sistema de numración decimal; por ejemplo, de $11,316_{10}$, esto es $\text{frac}(11,316_{10})=0,316_{10}$ . Veamos cómo podemos expresarla pues en el sistema de numeración binario ( con ceros y unos ).

Como observación preliminar - que tal vez resulte una obviedad al operar en base $10$, si bien nos guiará para hacer lo análogo al operar en base $2$ - démonos cuenta de que para obtener de manera mecánica las cifras decimales de dicho número podemos proceder de la siguiente manera ( pongamos que quién lo haga es un ordenador, y así deberíamos programarlo ):

i) Tomemos la parte fraccionaria, $0,316_{10}$, y multipliquémosla por la base de numeración - que es $10$ -, $0,316_{10} \cdot 10 =3,16_{10}$, lo cual, obviamente, nos proporciona la cifra de las décimas: $3$

ii) Tomamos ahora la parte fraccionaria de $3,16_{10}$, $\text{frac}(3,16_{10})=0,16_{10}$, y multipliquémosla por la base de numeración, $10$, así $0,16_{10} \cdot 10 =1,6_{10}$, lo cual nos proporciona la cifra de las centésimas: $1$

iii) Y, finalmente - puesto que sólo hay tres cifras decimales -, tomamos la parte fraccionaria de $1,6_{10}$, $\text{frac}(1,6_{10})=0,6_{10}$, y multipliquémosla por la base de numeración, $10$, así $0,6_{10} \cdot 10 =6_{10}$, lo cual nos proporciona la cifra de las milésimas: $6$

Fijémonos en el hecho de que, al escribir dicha cantidad en forma desarrollada: $$3\cdot 10^{-1}+1\cdot 10^{-2}+6\cdot 10^{-3}$$ obtenemos, como es bien claro, dicha parte fraccionaria:
$$0,3+0,01+0,006= 0,316$$

-oOo-

Pues bien, ahora vamos a proceder de manera análoga, con $0,632_{10}$ ( la parte decimal de $11,632_{10}$ ) pero expresándonos en base $2$, al objeto de ir obteniendo las cifras ( unos y ceros ) de las partes enteras que vayan resultando en los sucesivos cálculos, y que iremos concatenando desde el bit más significativo al menos significativo, $$.\square \,\square\, \ldots$$ en el orden que vayamos realizando dichas operaciones -- Nota: por $\text{ent}(.)$ nos referiremos a la cifra que quede a la izquierda de la coma/punto decimal, que será un uno o bien un cero --:

$\text{frac}(0,632_{10})\cdot 2=0,316_{10}\cdot 2=0,632 \rightarrow \text{ent}(\textbf{0},632_{10})=\textbf{0} \rightarrow \;.\textbf{0} \square \, \square \, \ldots_{2}$
$\text{frac}(0,632_{10})\cdot 2=0,632_{10}\cdot 2=1,264 \rightarrow \text{ent}(\textbf{1},264_{10})=\textbf{1} \rightarrow \;.0\textbf{1} \square \, \square \, \ldots_{2}$
$\text{frac}(1,264_{10})\cdot 2=0,264_{10}\cdot 2=0,528 \rightarrow \text{ent}(\textbf{0},528_{10})=\textbf{0} \rightarrow \;.01\textbf{0} \square \, \square \, \ldots_{2}$
$\text{frac}(0,528_{10})\cdot 2=0,528_{10}\cdot 2=1,056 \rightarrow \text{ent}(\textbf{1},056_{10})=\textbf{1} \rightarrow \;.010\textbf{1} \square \, \square \, \ldots_{2}$
$\text{frac}(1,056_{10})\cdot 2=0,056_{10}\cdot 2=0,112 \rightarrow \text{ent}(\textbf{0},112_{10})=\textbf{0} \rightarrow \;.0101\textbf{0} \square \, \square \, \ldots_{2}$
$\text{frac}(0,112_{10})\cdot 2=0,112_{10}\cdot 2=0,224 \rightarrow \text{ent}(\textbf{0},224_{10})=\textbf{0} \rightarrow \;.01010\textbf{0} \square \, \square \, \ldots_{2}$
$\text{frac}(0,224_{10})\cdot 2=0,224_{10}\cdot 2=0,448 \rightarrow \text{ent}(\textbf{0},448_{10})=\textbf{0} \rightarrow \;.010100\textbf{0} \square \, \square \, \ldots_{2}$
$\text{frac}(0,448_{10})\cdot 2=0,448_{10}\cdot 2=0,896 \rightarrow \text{ent}(\textbf{0},896_{10})=\textbf{0} \rightarrow \;.0101000\textbf{0} \square \, \square \, \ldots_{2}$
$\vdots$

-oOo-

Nos encontramos ahora con la necesidad de reflexionar acerca del error de representación finita de dicha cantidad (en los registros binarios de un computador, que, naturalmente, son de longitud finita), puesto que, al tener ésta infinitos bits, necesariamente debe ser aproximada para poder ser representada (con el número finito de bits de los registros de memoria de datos de la máquina).

Démonos cuenta de que el proceso no termina nunca, esto es, la parte decimal del número expresada en el sistema binario tiene infinitas cifras, a pesar de que al expresarse en el sistema decimal dicha parte decimal sea finita. Ésto plantea un problema importante: a la hora de representar en los registros del computador dicha cantidad - que tienen una longitud finita - deberemos cortar la parte decimal en algún lugar, lo cual introduce un inevitable error (de representación).

En la representación finita ( de la máquina ) en coma flotante en lo que viene a llamarse "simple precisión", la mantisa - que es el número decimal del tipo $.01010000 \ldots$ - tiene una longitud de $23$ bits. Así que podríamos continuar el proceso anterior hasta sacar $15$ cifras binarias (bits) más. Sin embargo, veamos que sucede con el error de representación si nos quedásemos sólo con $8$ bits, esto es $0,632_{10} \approx .01010000_{2}$ [ Nota: Al expresar la cantidad en el sistema binario, suele utilizarse el punto decimal (en lugar de la coma, usada en nuestro país habitualmente en la expresiones en el sistema de numeración decimal) para indicar que a su derecha escribiremos las cifras binarias correspondientes a la parte fraccionaria del número en cuestión ].

La representación finita $.01010000_{2}$ corresponde a la siguiente cantidad
$0\cdot 2^{-1}+1\cdot 2^{-2}+0\cdot 2^{-3}+1\cdot 2^{-4}+0\cdot 2^{-5}+0\cdot 2^{-6}+0\cdot 2^{-7}+0\cdot 2^{-8}=$
$=2^{-2}+2^{-4}$
$=1/4+1/16$
$=5/16$
$=0,3125_{10} \neq 0,316_{10}$

Así pues, el error absoluto de la aproximación es $|0,316-0,3125|=0,0035$, y por tanto el error relativo es de $\dfrac{0,0035}{0,316}\approx 0,00111 = 1,11\,\%$. Es claro que para aumentar la precisión debemos aumentar el número de bits de la representación, por lo que con $23$ bits, el error relativo es, seguro, muchísimo menor. Dejo a la persona lectora el interesante ejercicio de calcularlo, retomando los cálculos donde los he dejado ( en el octavo bit ).
$\square$

martes, 21 de enero de 2020

Conversión de un número dado en el sistema de numeración decimal al sistema binario

En ingeniería electrónica y computación es importante saber expresar un número (dado en el sistema de numeración decimal) en el sistema binario. El sistema binario consta de sólo dos caracteres 'alfabéticos', el 0 y el 1. Cada uno de estos dos valores da nombre a la unidad de información matemática, el bit ( del inglés, 'binary unit' ).

Así, concatenando los signos básicos, podemos decir que
$0_{10}=0_{2}$
$1_{10}=1_{2}$
$2_{10}=10_{2}$
$3_{10}=11_{2}$
$4_{10}=100_{2}$
$\vdots$

Démonos cuenta de que ésto es así porqué, al expresar los números en suma de potencias de base 2, efectivamente se obtienen los números en base 10; por ejemplo:
$100_{2}=1\cdot 2^2+0\cdot 2^1+0\cdot 2^0=4+0+0=4_{10}$

Nos interesa, ahora, asentar un procedimiento que permita la transformación de decimal a binario a partir de un número arbitrariamente grande, y no sólo uno de los números pequeños a los que nos hemos referido arriba como ejemplos; así, por ejemplo:

$19_{10}=\square\,\square\,\ldots\,\square_{2}$
Observemos que al efectuar la división entera $17$ entre $2$ ( que es el número de símbolos del 'alfabeto' binario ) obtenemos ( por el teorema de la división entera):
$19=9\cdot 2 +1$
y dividiendo otra vez,
$9=4\cdot 2 +1$
y seguimos ...
$4=2\cdot 2 +0$
hasta que, finalmente, llegamos a la última división posible,
$2=1\cdot 2 +0$

Pues, bien, concatenando los unos y ceros que se obtienen empezando por el cociente de la última división, y, siguiendo la concatenación con los restos, desde la última división a la primera ( de bits menos significativos a bits más significativos ), resulta:
$$19_{10}=10011_{2}$$
Cualquier número expresado en base 10 se convierte, siguiendo este algoritmo, en su expresión en base 2.

Comprobémoslo, en el ejemplo expuesto, escribiendo el desarrollo en sumas de potencias de base 2, para ver si obtenemos el número dado expresado en base 10. En efecto,
$$10011_{2}=1\cdot 2^4+0\cdot 2^3+0\cdot 2^2+1\cdot 2^1+1\cdot 2^0=16+0+0+2+1=19_{10}$$
$\square$


Expresión de un número dado en base decimal al sistema hexadecimal

En ingeniería electrónica y programación se utilizan también otros sistemas de numeración además del decimal. El sistema binario, en el que cada palabra se codifica con unos y ceros, es el código más próximo a la máquina, si bien los ingenieros, al programar los microprocesadores, también utilizan a menudo el sistema hexadecimal para direccionar la información en los registros de memoria. En el sistema hexadecimal se utilizan 16 caracteres para componer 'palabras': {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}, por lo que
$0_{10}=0_{16}$
$1_{10}=1_{16}$
$2_{10}=2_{16}$
$3_{10}=3_{16}$
$4_{10}=4_{16}$
$5_{10}=5_{16}$
$6_{10}=6_{16}$
$7_{10}=7_{16}$
$8_{10}=8_{16}$
$9_{10}=9_{16}$
$10_{10}=A_{16}$
$11_{10}=B_{16}$
$12_{10}=C_{16}$
$13_{10}=D_{16}$
$14_{10}=E_{16}$
$15_{10}=F_{16}$
$\vdots$

Para expresar el número $589_{10}$ en hexadecimal hacemos lo siguiente:
1.º Lo expresamos en base 2, de la manera que ya habéis estudiado en clase y tal como podéis repasar en esta otra entrada del blog
    $583_{10}=001001001101_{2}$
2.º A continuación, separamos dicha palabra binaria en grupos de cuatro, empezando por el bit de la derecha ( el bit menos significativo ), rellenando con los ceros necesarios a la izquierda para completar el último grupo de cuatro bits ( en este caso es innecesario, pues el número total de bits es múltiplo 12, que es múltiplo de 4 )
    $0010\;0100\;1101$
3.º Ahora expresamos cada grupo de cuatro bits en base 10 ( empezando por el primero a la izquierda ), y, según las correspondencias que hemos deducido arriba, escribimos el carácter en hexadecimal que tenga asociado. Así,
    $0010_{2}=2_{10}=2_{16}$
    $0100_{2}=4_{10}=4_{16}$
    $1101_{2}=13_{10}=D_{16}$
4.º Y finalmente concatenamos los resultados obtenidos:
    $583_{10}=24D_{16}$

NOTA: Observemos que, de acuerdo con el desarrollo de pontencias en base $16$, ésto significa que
$$24D_{16}=2\cdot 16^2+4\cdot 16^1+ 13\cdot 16^0=2\cdot 256+4\cdot 16+13\cdot 1=589_{10}$$
como debe ser. $\square$

jueves, 9 de enero de 2020

La extraordinaria precisión en la medida del radio del protón

La medida más precisa del radio del protón que se ha obtenido hasta el momento presente, mediante es estudio del espectro del hidrógeno excitado, es de $0,833\,\pm\,0,010$ femtómetros ( recordemos que 1 femtómetro = $10^{-15}\,\text{m}$ ). Como ya sabemos, quiere decir ésto que el radio del protón está en el intervalo de incertidumbre $(0,833-0,010\,,\,0,833+0,010)$ femtómetros, esto es, tiene un valor comprendido entre $0,823\times 10^{-15}\,\text{m}$ y $0,843\times 10^{-15}\,\text{m}$ . Podéis leer más acerca de ello en el número de diciembre de 2019, N.º 519, de la revista Investigación y Ciencia, pp. 5-7.