RAIZ CUADRADA INVERSA RÁPIDA: El algoritmo "mágico" del videojuego Quake III

Llama Elitista
27 Jul 202425:06

Summary

TLDRThis video explores the revolutionary 1999 game 'Quake III' and its groundbreaking engine. It delves into the mysterious 'magic number' in the game's inverse square root algorithm, crucial for 3D graphics and physics simulations. The script discusses the use of bit-level hacking and the method of Newton to achieve high precision in calculations, showcasing the ingenuity of early 3D game development.

Takeaways

  • 🎮 The 1999 game 'Quake 3' was revolutionary in the gaming industry, known for its pioneering work in 3D gaming and online multiplayer.
  • 🛠️ 'Quake 3' utilized a powerful engine that was optimized to run on the widest range of computers at the time, influencing the development of many game sagas, including 'Half Life' and 'Call of Duty'.
  • 🔢 The script focuses on a piece of C code from the 'Quake 3' engine, which calculates the inverse square root of a number—a critical operation for 3D vector normalization.
  • 💡 The algorithm in question was much faster than the standard method, running up to four times quicker, which was essential given the computational constraints of 1999.
  • 🕹️ In 'Quake 3', the inverse square root operation was used extensively for simulating physics like lighting and texture shading, requiring rapid and efficient computation.
  • 📚 The script delves into the binary representation of numbers, explaining how floating-point numbers are stored in memory using the IEEE 754 standard.
  • 🤔 A mysterious constant in the code, referred to as 'magical', has long puzzled programmers due to its unknown origin and calculation method.
  • 📉 The script explains the process of logarithmic approximation to simplify the inverse square root calculation, avoiding the need for slow division operations.
  • 👻 The 'evil floating-point bit-level hacking' mentioned in the script refers to the technique of manipulating the bits of a floating-point number to extract its memory representation without altering the number itself.
  • 🔄 The method of Newton is introduced as a way to refine the approximation further, using the principles of calculus to iteratively approach the precise inverse square root.
  • 📝 The script concludes by highlighting the combination of clever programming tricks, deep understanding of computer memory, and mathematical ingenuity that made the 'Quake 3' algorithm both fast and accurate.

Q & A

  • What is the significance of Quake III in the gaming industry?

    -Quake III, released in 1999, was a revolutionary game that significantly impacted the gaming industry. It was known for its pioneering implementation of online multiplayer and its powerful engine, which was optimized to run on a wide range of computers of that era. The engine played a crucial role in the development of many video game franchises that are still active today, such as Half-Life and Call of Duty.

  • What was the main purpose of the inverse square root algorithm in Quake III's engine?

    -The inverse square root algorithm in Quake III's engine was used to calculate the inverse square root of a number, which is essential for various mathematical operations in 3D games, such as normalizing vectors. This operation is crucial for simulating physics like lighting, shading, and reflection of light in 3D environments.

  • Why was the inverse square root algorithm considered 'magic' in the context of Quake III?

    -The inverse square root algorithm was considered 'magic' due to a mysterious number that appeared in its code. This number was difficult to decipher, and its origin or calculation method was not initially understood, adding an air of mystery to the algorithm.

  • How did the Quake III developers optimize the inverse square root calculation for performance?

    -The developers of Quake III found an algorithm that could achieve the same result as the standard inverse square root calculation but was up to four times faster. This was crucial for the performance of the game on the computers of that time, which were not as powerful as today's gaming PCs.

  • What is vector normalization and why is it important in 3D graphics?

    -Vector normalization is the process of scaling a vector to have a magnitude of one. This is important in 3D graphics because it ensures that vectors representing surfaces or objects in a 3D space have consistent behavior and appearance, regardless of their original magnitude. Consistent vector magnitudes are crucial for accurate lighting and shading effects.

  • How do computers typically represent numbers in memory?

    -Computers typically represent numbers in memory using binary format. For integers, a common approach is to use 32 bits, with the first bit representing the sign (positive or negative) and the remaining 31 bits representing the magnitude in binary form. For floating-point numbers, a more complex method involving scientific notation and binary exponents is used, as defined by the IEEE 754 standard.

  • What is the IEEE 754 standard and how does it relate to floating-point numbers?

    -The IEEE 754 standard is a widely used format for representing floating-point numbers in computer systems. It uses a combination of sign bits, exponent bits, and mantissa bits to efficiently store decimal numbers in binary form. This standard allows for a balance between precision and the range of numbers that can be represented.

  • What is bit shifting and how is it used in the context of the inverse square root algorithm?

    -Bit shifting is a technique used in binary operations where bits of a number are moved to the left or right, effectively multiplying or dividing the number by powers of two. In the context of the inverse square root algorithm, bit shifting is used to avoid actual division operations, which can be computationally expensive.

  • What is the role of the 'magic number' in the inverse square root algorithm?

    -The 'magic number' in the inverse square root algorithm is a constant that is used to approximate the inverse square root calculation. Its exact value was not initially understood and was derived through clever programming tricks and mathematical approximations. It plays a crucial role in the algorithm's efficiency and accuracy.

  • How does the Newton-Raphson method fit into the inverse square root algorithm in Quake III?

    -The Newton-Raphson method is used in the final stages of the inverse square root algorithm to refine the approximation. It iteratively improves the estimate of the inverse square root by using tangent lines and the derivative of the function being approximated. This method helps achieve a high level of precision in the final result.

Outlines

00:00

🎮 The Legacy of Quake 3D and Its Innovative Engine

This paragraph delves into the history and impact of 'Quake 3D', a revolutionary game released in 1999 that introduced a powerful engine optimized for a wide range of computers of its time. It played a significant role in the development of many subsequent gaming sagas, including 'Half Life' and 'Call of Duty'. The script focuses on a piece of C language code from the Quake engine, which was shrouded in mystery due to an enigmatic number. The algorithm in question calculates the positive inverse square root of a number, a task simple in theory but complex in its optimized implementation for the era's hardware limitations.

05:00

👨‍💻 Behind the Scenes: Quake's Algorithm and Binary Representation

The script explains the technical aspects of the Quake game engine's algorithm for calculating inverse square roots, which was faster than the standard method by up to four times. It discusses the challenges of performing mathematical operations like division and square roots on the computers of 1999. The explanation includes the binary representation of numbers, the use of 32-bit 'Long' integers, and the complexities of storing decimal numbers in memory, introducing the concept of scientific notation and its application in binary form, known as the IEEE 754 standard.

10:00

🔢 Unraveling the Mystery: The Magic Number and Bit-Level Manipulation

This paragraph explores the intricacies of the 'magic' number used in Quake's algorithm, which was derived from an approximation equation. It explains how the number was used in conjunction with bit-level manipulation techniques, such as casting a float to an integer to access the memory representation of a floating-point number. The script also covers the process of using logarithms and bit shifting to avoid divisions, which were computationally expensive at the time, and how these techniques contributed to the algorithm's efficiency.

15:02

📚 Deep Dive into Newton's Method and Its Application in Quake's Algorithm

The script introduces Newton's method, a technique for finding successively better approximations to the roots of a real-valued function. It applies this method to the problem of calculating the inverse square root, transforming the problem into an iterative process that refines the approximation. The explanation includes the use of a 'magic' constant in the algorithm, the origins of which remain a mystery, and how this constant, along with bit-level hacking and clever programming tricks, contributes to the algorithm's remarkable efficiency and precision.

20:03

🔄 Newton's Method in Practice: Refining the Inverse Square Root Algorithm

The final paragraph details the practical implementation of Newton's method in the context of the Quake engine's inverse square root algorithm. It describes the iterative process of refining the initial approximation, the significance of the chosen constants, and the ultimate achievement of a highly efficient and accurate algorithm. The script concludes by highlighting the combination of mathematical insight, deep understanding of computer memory, and programming ingenuity that made the algorithm possible, leaving the audience with a sense of awe at the blend of magic and science in computing.

Mindmap

Keywords

💡Quake

Quake is a revolutionary series of first-person shooter video games that were highly influential in the gaming industry. The script discusses the third installment of the series, 'Quake 3,' which was released in 1999 and was known for its pioneering online multiplayer mode and its powerful game engine. The game's significance is tied to the video's theme as it exemplifies the technological advancements in gaming and the importance of efficient algorithms for performance optimization.

💡Game Engine

A game engine is the core software framework upon which a video game is built. In the context of the video, the Quake game engine is highlighted for its optimization to run on a wide range of computers of that era, which was crucial for the game's success and its influence on subsequent game development. The engine's efficiency is a central theme in the video as it relates to the innovative algorithms discussed.

💡Inverse Square Root

The inverse square root is a mathematical operation that calculates the reciprocal of a square root. In the script, this operation is central to the video's narrative as it is used to normalize vectors in 3D space for games like Quake. The video delves into an ingenious algorithm implemented in the Quake engine to compute this operation more efficiently, which is vital for the game's physics simulations.

💡Vector

In the script, a vector is described as a mathematical and physical quantity that has both magnitude and direction. In the context of 3D graphics, vectors are used to represent directions and magnitudes, such as the path and intensity of light rays in a 3D game environment. The normalization of vectors, which involves adjusting their magnitude to one, is a key process in the video's explanation of the Quake engine's functionality.

💡Normalization

Normalization in the video refers to the process of adjusting a vector's magnitude to one, which simplifies calculations in 3D graphics. This process is essential for ensuring consistent behavior in the game's physics, such as light reflection and texture shading. The video explains how the inverse square root operation is used in vector normalization, which is a fundamental concept in the game's rendering process.

💡IEEE 754

IEEE 754 is a standard for floating-point arithmetic that defines how floating-point numbers are represented in computer memory. The script discusses this standard in the context of how decimal numbers are stored and manipulated in a computer system. Understanding IEEE 754 is crucial for the video's theme as it underpins the discussion on how the Quake engine's algorithm works with floating-point numbers for efficient computation.

💡Bit Level Hacking

Bit level hacking, as mentioned in the script, refers to the manipulation of individual bits in a computer's memory to achieve a desired outcome, such as optimizing an algorithm. In the video, this concept is used to describe the technique employed in the Quake engine to extract and manipulate the bits of a floating-point number without altering its value, which is a key part of the inverse square root algorithm.

💡Newton's Method

Newton's Method, also known as the Newton-Raphson method, is an iterative technique for finding successively better approximations to the roots, or solutions, of a real-valued function. In the script, Newton's Method is used to refine the approximation of the inverse square root operation. The video explains how this method is applied in the context of the Quake engine's algorithm to achieve high precision in calculations.

💡Mantissa

In the context of the IEEE 754 standard discussed in the script, the mantissa is the significant digits part of a floating-point number. The video explains how the mantissa, along with the exponent, is used to represent a decimal number in binary form. Understanding the role of the mantissa is important for grasping how floating-point numbers are handled in the Quake engine's algorithm.

💡Exponent

The exponent in the IEEE 754 standard is used to scale the mantissa to represent the full range of a floating-point number. In the script, the video explains how the exponent is adjusted and stored in memory to reflect the magnitude of the number. The manipulation of the exponent is a key aspect of the inverse square root algorithm discussed in the video.

💡Magic Number

The 'magic number' in the script refers to a specific constant used in the Quake engine's inverse square root algorithm. It is called 'magic' because its origin and derivation were not initially understood. The video explores the mystery surrounding this number and how it plays a crucial role in the algorithm's efficiency and effectiveness.

Highlights

The year 1999 saw the release of Quake III, a revolutionary game in the industry.

Quake III was a pioneer in implementing online multiplayer.

Quake's engine was highly optimized to run on a wide range of computers of the time.

The Quake engine influenced the development of many game sagas, including Half Life and Call of Duty.

The focus of the video is on a piece of C code from Quake III's engine.

The algorithm in question calculates the positive inverse square root of a number.

The straightforward implementation of the inverse square root is slow on older computers.

The Quake developers found an algorithm that is up to four times faster than the normal method.

The inverse square root operation is crucial in 3D games for physics simulations like lighting and texture shading.

Vectors in 3D graphics are used to determine behaviors like light reflection, requiring normalization.

Normalization of vectors involves reducing their magnitude to one, simplifying calculations.

Computers handle numbers in binary, but operations are typically in base 10.

32-bit integers are represented with one bit for the sign and 31 bits for the number.

Floating-point numbers are stored using scientific notation in binary, known as IEEE 754.

The algorithm uses bit-level hacking to extract and manipulate the bits of a floating-point number without changing its value.

The 'magic number' in the code is used to approximate the inverse square root, though its origin remains a mystery.

The method of Newton is used to refine the approximation further, providing a highly effective algorithm.

The algorithm's effectiveness is due to a combination of clever programming tricks, deep knowledge of computer memory units, and mathematical refinement.

Transcripts

play00:04

el año 1999 de la mano de los creadores

play00:07

de T y wst 3D uno de los juegos más

play00:10

revolucionarios que ha dado la industria

play00:12

vería la luz la tercera entrega de la

play00:14

saga quake una saga que quizá a día de

play00:17

hoy no evoque mucha atención del público

play00:19

pero que en su tiempo fue de los más

play00:21

famosos shooters 3D pionero en la

play00:23

implementación del multijugador online y

play00:26

muy conocido en el mundo de los

play00:27

desarrolladores debido a su poderoso

play00:28

motor llamado engine motor

play00:31

explícitamente optimizado para correr en

play00:33

la mayor cantidad de computadoras de la

play00:35

época y que fue elemento clave directa o

play00:38

indirectamente en el desarrollo de

play00:39

muchas sagas de videojuegos algunos que

play00:42

siguen vigentes Incluso el día de hoy

play00:43

como Half Life o Call of

play00:46

Duty hay mucho que podríamos decir sobre

play00:49

quake pero en este video nos enfocaremos

play00:51

en este trozo de código en lenguaje c

play00:54

que forma parte de lo que fue el motor

play00:56

de quake 3 y es que este algoritmo tiene

play01:00

tantas capas de genialidad que no solo

play01:01

es ingeniosa la forma en como fue

play01:03

implementado Sino que también estuvo

play01:05

envuelta en un Halo de misterio debido a

play01:07

cierto número extraño que aparece en su

play01:10

código que por mucho tiempo nadie llegó

play01:13

a descifrar de dónde fue que salió o

play01:15

cómo es que fue calculado por lo que se

play01:18

ganó el rótulo de

play01:25

mágico Antes que nada es importante

play01:27

definir Qué hace el algoritmo Y es que s

play01:29

entemente hace algo bien sencillo el

play01:32

algoritmo simplemente haa la raíz

play01:34

cuadrada inversa positiva de un número

play01:36

es decir si la entrada de la función

play01:38

fuera 4 el resultado será 1/2 o 0.5 en

play01:42

decimales Y es que es tan sencillo que

play01:44

tampoco es difícil de implementar si

play01:46

sabes programación básica en C esto se

play01:49

haría de la siguiente forma sin embargo

play01:51

el algoritmo que se implementó en el

play01:54

motor es bastante más complejo Por qué

play01:58

Recuerden que era el año 1000 1999 las

play02:01

computadoras no eran precisamente del

play02:03

tipo Gamer y la forma simple era lenta

play02:06

para los procesos que se requerían en el

play02:08

juego en Aquellos tiempos los

play02:10

procesadores manejaban bien operaciones

play02:12

como la multiplicación y la suma pero la

play02:14

división y la raíz cuadrada no eran

play02:16

precisamente su punto fuerte para este

play02:19

fin es que los programadores de quake

play02:21

encontraron un algoritmo que haya el

play02:23

mismo resultado pero hasta cuatro veces

play02:25

más rápido que la forma normal y

play02:27

hablando del juego

play02:28

exactamente En qué parte del juego se

play02:30

utiliza esta

play02:34

operación quake como muchos otros juegos

play02:37

3D tiene físicas simuladas como puede

play02:40

ser iluminación sombreo de texturas

play02:43

reflexión de luz entre otras cosas y

play02:46

para que esto funcione en un computador

play02:48

el juego se apoya de un concepto

play02:49

matemático llamado vector de forma

play02:52

simple un vector es un segmento que

play02:54

tiene magnitud y

play02:56

dirección y la podemos Representar en un

play02:58

campo 3D con sus coordenadas en los ejes

play03:00

x y z las superficies de los gráficos en

play03:04

3D suelen utilizar vectores que nos

play03:06

ayudan a determinar por ejemplo cómo le

play03:08

rebotara un rayo de luz normalmente

play03:11

todos los vectores deben tener una misma

play03:13

magnitud Y esto es debido a que si dos

play03:16

superficies iguales tienen vectores de

play03:18

distinto tamaño pueden tener

play03:19

comportamientos raros si las magnitudes

play03:23

no son iguales podemos transformarlas

play03:25

matemáticamente al valor con el que es

play03:27

más fácil trabajar la unidad a este

play03:30

proceso se le llama normalización cuando

play03:33

normalizamos un vector reducimos su

play03:35

magnitud original a uno y como es obvio

play03:38

sus componentes en x y z también se

play03:40

achican Cómo saber qué valor ahora

play03:42

tienen estos nuevos

play03:44

componentes Ah Pues para eso usamos la

play03:48

fórmula de la magnitud de un vector la

play03:50

cual es igual a la raíz del cuadrado de

play03:52

cada una de las

play03:53

coordenadas quizás esto le suene un poco

play03:56

del colegio y es que se parece mucho al

play03:58

teorema de Pitágoras verdad

play04:01

pues de hecho usa la misma lógica con la

play04:04

diferencia de que el teorema de

play04:05

Pitágoras serviría para vectores en

play04:08

2D pero volviendo al tema Si queremos

play04:10

que la magnitud sea uno simplemente

play04:13

dividimos cada componente del vector

play04:14

entre su

play04:16

magnitud porque de esta forma al

play04:18

resolver la fórmula podemos observar que

play04:20

ahora Siempre será

play04:22

uno así fue que hemos logrado el

play04:24

procedimiento de normalización

play04:32

claramente Se observa en el proceso de

play04:34

normalización El Por qué la inversa de

play04:36

la raíz es tan importante y eso no es lo

play04:39

único sino que al ser un juego 3D tan

play04:41

detallado debía correr este proceso

play04:43

miles de miles de veces en cada

play04:45

renderizado he ahí su

play04:51

importancia debido a que el algoritmo

play04:53

utiliza bastantes trucos relacionados a

play04:55

la forma en Cómo se guardan los números

play04:57

en la memoria del computador lo mejor es

play05:00

explicar algunos conceptos previos como

play05:03

es de conocimiento general las

play05:04

computadoras se manejan en el mundo de

play05:06

los binarios Pero no es así para las

play05:09

operaciones del día a día donde

play05:10

usualmente la base es 10 Si quisiéramos

play05:13

guardar un número de esta base en la

play05:15

memoria del computador Cuál es el

play05:17

procedimiento el procesador usualmente

play05:19

nos da 32 bits o espacios para alojar un

play05:22

número en el caso de enteros Es simple

play05:26

como pueden ser positivos o negativos el

play05:28

primer bit se usa para representar el

play05:30

signo en los 31 restantes simplemente

play05:32

ponemos el número en su equivalente

play05:34

binario en el contexto de programación a

play05:37

este tipo de dato no se le llama entero

play05:39

sino Long y por qu 32 bits Porque así es

play05:44

como ha diseñado el procesador de hecho

play05:46

esto de 32 bits y 64 bits les debe

play05:49

recordar algo en la actualidad ya los

play05:51

procesadores de 32 bits no son tan

play05:53

comunes pero en el pasado Pues eran la

play05:55

Norma este algoritmo se hizo para 32

play05:57

bits justo por esta razón los números

play06:00

decimales o floats como se le llama en

play06:02

sistemas computacionales se guardan en

play06:04

memoria de una forma más compleja

play06:06

Recuerden que los decimales tienen una

play06:08

parte entera y una parte decimal Así que

play06:10

no es tan simple como guardar enteros

play06:12

qué tal si queremos guardar este número

play06:14

El

play06:16

14.625 en los 32 bits que tenemos

play06:18

disponibles bueno en primer lugar

play06:20

podemos utilizar 16 bits para su parte

play06:22

entera y 16 para la decimal pero si lo

play06:25

haríamos así hemos reducido a la mitad

play06:27

los números enteros que podemos

play06:29

representar Y de paso hemos limitado

play06:31

también el lado decimal por lo que

play06:33

perderemos precisión Para aprovechar

play06:35

mejor estos 32 espacios de los que

play06:36

disponemos podemos usar la anotación

play06:38

científica Esta anotación es un tipo de

play06:40

representación que usualmente se usa en

play06:42

física o en otras ciencias relacionadas

play06:44

y es fácil de usar Por ejemplo si

play06:46

tenemos el número 5 millones en lugar de

play06:49

escribir tantos ceros podemos

play06:51

representarlo como 5 * 10 a la 6 Esta es

play06:54

su notación científica en esta notación

play06:56

el cinco es conocido como mantisa y el

play06:59

seis como exponente la mantia siempre es

play07:01

un número mayor a uno y menor a 10 para

play07:05

notación científica de binarios La idea

play07:06

es la misma Solo que las potencias de 10

play07:09

por las que se multiplican está en

play07:11

binarios y puede pasarse a potencias de

play07:14

dos para que coincida con la base es

play07:17

importante observar que la mantia al ser

play07:19

binaria siempre es mayor a uno y menor a

play07:21

dos en esta base utilizando notación

play07:23

científica Entonces utilizaremos los 32

play07:26

espacios de forma más eficiente para

play07:28

guardar los bits que representan nuestro

play07:30

número decimal esto resultaría así un

play07:33

bit para el signo c si es positivo y uno

play07:36

si es negativo 8o bits para el exponente

play07:38

lo que nos permitiría guardar en sí 256

play07:41

valores desde el 0 al

play07:43

255 Aunque es importante recordar aquí

play07:46

que el exponente también puede ser

play07:48

negativo por lo que de esta forma no

play07:50

podríamos representarlo para solucionar

play07:53

esto el valor que está en la memoria se

play07:55

debe restar por 127 y este es el valor

play07:58

que se representa en la realidad

play08:00

en nuestro ejemplo el exponente es 3 Así

play08:02

que en la memoria debe estar guardado

play08:04

130 tal que 130 - 127 es 3 esto nos

play08:09

permite representar exponentes negativos

play08:11

tal como se ve en este otro

play08:15

ejemplo pasando a los 23 bits restantes

play08:18

de la mantia como ya se vio en los

play08:20

ejemplos de la anotación de binarios

play08:22

esta siempre es mayor a un y menor a do

play08:25

O sea que siempre tendrá un uno en la

play08:28

parte entera como como la parte entera

play08:30

es un valor que no cambia nunca Entonces

play08:32

no tiene sentido guardarlo por ello los

play08:34

23 bits de la mantia se ocupan

play08:36

exclusivamente para su parte decimal y

play08:40

de esta forma es que se guardan números

play08:41

decimales en memoria a través de los

play08:43

bits que Los representan este método es

play08:45

el conocido estándar iee754 que quizás

play08:49

si están estudiando sistemas se lo topen

play08:50

en algún momento ahora a partir de ese

play08:53

estándar llegaremos a unas ecuaciones

play08:56

interesantes empecemos intentando hacer

play08:58

lo contrario a lo que hicimos antes o

play09:00

sea a partir de los bits en memoria

play09:02

recuperaremos el número

play09:05

original para ello tenemos s e y m

play09:09

variables que toman los valores de los

play09:11

bits de signo exponente y mantia

play09:13

respectivamente los bits de m se

play09:16

encuentran como si fueran un número

play09:17

entero pero recordar que representan

play09:19

solo la parte decimal de la mantia por

play09:22

lo que primero tomamos los 23 bits de m

play09:24

y los dividimos entre 2 a la 23 para

play09:27

regresarlo así a su forma decimal

play09:30

luego recuperaremos el entero de la

play09:32

mantia sumando uno ya que Recuerden que

play09:34

siempre es uno en notación científica

play09:36

resultando igual a 1 + m ent 2 a la 23 o

play09:40

por 2 a la-23 que es lo mismo respecto a

play09:43

s el signo del número como el algoritmo

play09:46

solo deben ingresar números positivos

play09:48

Entonces ese Siempre será cero y podemos

play09:51

ignorarlo finalizando con la exponente

play09:53

recordemos que este se guarda tal cual

play09:55

el valor que representa pero con una

play09:57

diferencia de 127

play10:00

y Bueno listo hemos encontrado así la

play10:02

ecuación para regresar de los bits con

play10:04

estándar I 754 al número binario decimal

play10:08

que representa esta será la ecuación

play10:13

uno ahora veamos el número alojado de

play10:16

memoria desde otro ángulo en lugar de

play10:18

ver lo que representa qué tal si lo

play10:20

vemos como un número entero qué tal si

play10:23

queremos representar este número entero

play10:25

en función de las variables s e y m para

play10:28

esto pues podemos descomponer el entero

play10:30

en tres sumandos de forma que logremos

play10:32

sacar los bits de s e y m de alguna

play10:36

forma Aunque un sumando correspondería A

play10:38

S como ya sabemos que siempre es cer0 lo

play10:41

podemos ignorar de esta forma el primer

play10:43

sumando que queda corresponde a e tal

play10:46

que este número son los 8 bits de e con

play10:49

23 ceros extras debido a la separación

play10:52

de los 23 bits de m y Bueno finalmente

play10:55

el segundo sumando que es simplemente m

play10:58

porque son los bits de la parte final la

play11:01

suma de estos dos forman el número

play11:02

entero por tanto la siguiente ecuación

play11:05

que tenemos es

play11:06

esta y esta será la ecuación

play11:11

dos recapitulando tenemos estas dos

play11:14

ecuaciones el primero encuentra el

play11:16

número decimal guardado en memoria y el

play11:19

segundo encuentra los bits en memoria

play11:21

que representan este decimal entendiendo

play11:24

esto apliquemos la operación de

play11:26

logaritmo a la primera ecuación por qué

play11:28

logaritmo HM No sabría decir la verdad

play11:31

eh No encontré el Por qué solo que así

play11:34

se hizo Pero en fin el logaritmo que le

play11:37

aplicamos obviamente será de base dos

play11:39

porque estamos trabajando con binarios

play11:41

si operamos lo que corresponde al final

play11:44

no podemos desaparecer este logaritmo

play11:46

debido a la suma qué hacemos ahora bueno

play11:49

existe de hecho una aproximación

play11:50

logarítmica para simplificar operaciones

play11:52

de este tipo donde logaritmo de 1 + x es

play11:56

x siempre y cuando x tenga un valor

play11:58

pequeño menor a uno si lo vemos

play12:00

gráficamente De hecho sí se ve muy

play12:03

aproximada y se puede aproximar aún más

play12:06

si es que se le hacen algunos ajustes

play12:08

representados en la variable

play12:10

Sigma de esta forma usando la

play12:13

aproximación desapareceremos la suma

play12:16

luego movemos un poco los valores y le

play12:18

damos otra forma y llegamos a esto

play12:20

pueden notar

play12:23

algo ha aparecido mágicamente el valor

play12:26

de la ecuación dos la que haya los bits

play12:29

en memoria de un decimal si reemplazamos

play12:32

encontramos una relación directa entre

play12:34

el logaritmo de un número decimal y los

play12:37

bits en memoria que representan dicho

play12:39

decimal llamaremos a esta la tercera

play12:42

ecuación toda esta explicación ha sido

play12:45

larguísima para llegar a una ecuación

play12:47

Tan pequeña pero no la subestimen Porque

play12:49

será importante para develar la magia

play12:51

del algoritmo en cuestión ahora

play12:53

explicaremos por qué recuerdan la

play12:56

operación que queríamos encontrar eh Y

play12:59

es la salida y x es la entrada si le

play13:03

aplicamos logaritmo de base 2 a ambos

play13:05

lados y tenemos en cuenta que la entrada

play13:07

y salida son decimales Pues operando un

play13:10

poco podemos ver que nos Será muy útil

play13:12

la ecuación

play13:15

3 reemplazamos utilizando dicha

play13:18

ecuación y ordenamos y agrupamos las

play13:22

constantes que son iguales llegando así

play13:24

a esta otra igualdad que llamaremos

play13:26

ecuación 4 est eación es el resultado

play13:30

final al que queríamos llegar ya que nos

play13:32

da una relación entre la entrada y la

play13:34

salida Aunque en su formato de bits en

play13:37

memoria con esto ya hemos conseguido una

play13:40

aproximación a la raíz cuadrada inversa

play13:43

Así que en teoría podríamos acabar el

play13:45

algoritmo aquí solo quedaría ajustar el

play13:48

valor de Sigma que si lo ponemos en cero

play13:50

y graficamos observamos que el resultado

play13:52

ya se acerca mucho a lo que se

play13:57

quiere teniendo esto presente si

play14:00

quisiéramos implementar esto en C

play14:02

tocaría preguntarse es esta aproximación

play14:05

más veloz que la raíz cuadrada inversa

play14:07

común pues para empezar no hay raíces

play14:09

por ese lado tenemos un punto a favor y

play14:11

estas divisiones Bueno en realidad estas

play14:14

no afectan porque fácilmente podríamos

play14:17

cambiarlas a multiplicaciones

play14:18

equivalentes Entonces sí es mucho más

play14:21

veloz aún así Este no es el final del

play14:24

algoritmo la gente detrás de su

play14:26

implementación fue aún más lejos por lo

play14:29

que aún queda magia por develar así que

play14:32

adentremos en el

play14:37

código lo primero que se observa en esta

play14:40

sección es una simple declaración de

play14:42

variables básicamente se le dice a c Qué

play14:45

tipo de datos son las variables con las

play14:46

que trabajaremos

play14:48

primero tenemos number el cual es el

play14:51

número de tipo float o decimal que entra

play14:53

a la función y luego tenemos y

play14:57

Igualmente decimal que si vos la parte

play14:59

final es la salida de la

play15:01

función para hacer un símil con las

play15:04

ecuaciones que hallamos y que nos sea

play15:05

todo más fácil de entender le cambiamos

play15:07

el nombre de la entrada number por

play15:11

x luego tenemos I x2 y 3 hales 3h es una

play15:17

constante de valor decimal 1.5 mientras

play15:20

que las otras dos son variables

play15:21

auxiliares en la línea siguiente se le

play15:24

asigna un valor a x2 el cual es la mitad

play15:26

de X como ya sabemos la idea es no usar

play15:29

divisiones por lo que en su lugar se

play15:31

multiplicó por 0.5 luego y toma el valor

play15:34

de la entrada x todo muy simple hasta

play15:37

ahora pero lo que sigue Sí ya se ve algo

play15:39

más extraño se le asigna un valor a i

play15:43

pero no se ve tan legible y de hecho el

play15:45

comentario ya indica un comportamiento

play15:48

medio truculento Qué significa

play15:56

veamos desglosamos esta línea de código

play15:59

Empezando por el final lo primero que se

play16:01

ve es y que en la línea anterior se le

play16:04

dio el valor de la entrada x por lo que

play16:06

para propósitos didácticos usaremos X en

play16:08

su lugar el simbolito de su costado lo

play16:11

único que hace es obtener la dirección

play16:13

en memoria de esta variable es decir en

play16:16

qué parte de la memoria Se ha guardado x

play16:18

cada dato al ser guardado en la

play16:20

computadora tiene una dirección a la

play16:22

cual el procesador irá a buscar cuando

play16:24

lo necesite algo así como las columnas y

play16:26

filas del Excel esta dirección

play16:28

usualmente suele tener esta forma lo que

play16:31

sigue es esta parte si ignoramos el

play16:33

asterisco esto básicamente es un cast

play16:36

que es un método para convertir un tipo

play16:38

de dato a otro tipo como por ejemplo

play16:40

convertir un tipo entero a decimal el

play16:43

cast normal se usa con datos pero

play16:45

recordar que aquí se le aplica a una

play16:47

dirección y es por eso que aparece este

play16:49

asterisco que cambia el enfoque del cast

play16:52

ahora es un método para cambiar el tipo

play16:54

de la dirección del dato aunque las

play16:56

direcciones no tienen un tipo en sí sí

play16:58

sí an cierta información sobre el tipo

play17:00

del dato al que apuntan este cast

play17:03

convierte esa información de decimal a

play17:07

entero finalmente todo termina con

play17:09

asterisco que lo único que hace es

play17:11

recuperar un dato según la dirección

play17:13

dada como la dirección dice que el dato

play17:14

es entero pues se lo entiende así

play17:17

entonces el asterisco extrae los bits

play17:19

sin tocarlos y se los asigna a la

play17:21

variable de tipo entero I en resumen la

play17:25

variable I serían los bits en memoria

play17:27

del decimal x pero interpretados como si

play17:30

fueran un número entero dónde será que

play17:33

hemos visto esto antes pues claro y

play17:36

tiene exactamente el mismo valor que x

play17:39

bits que aparece en varias de las

play17:41

ecuaciones halladas incluyendo la más

play17:43

importante la ecuación 4 Ahora ven el

play17:46

sentido de hacer este truco si

play17:48

hubiéramos hecho un cast normal nos

play17:50

hubiera resultado algo que en realidad

play17:52

sí tiene sentido en programación normal

play17:54

y coherente pero hubiera modificado el

play17:56

valor de X por lo que sus bits se H

play17:58

hubieran perdido básicamente esta línea

play18:01

de código ha tenido el único objetivo de

play18:04

engañar a C para que nos permita extraer

play18:07

los bits de la entrada sin

play18:08

modificarlos y de ahí es que sale la

play18:11

frase del comentario Evil floating

play18:13

points bit Level hacking un hacking

play18:16

maligno de los bits de un número decimal

play18:19

a continuación veremos la línea de

play18:21

código que ha generado tanta admiración

play18:23

y confusión a lo largo de los años y

play18:25

pues no es de extrañar ya que con solo

play18:28

mirar el comentario original ya genera

play18:35

curiosidad podríamos empezar con el

play18:37

número mágico pero dejémoslo para el

play18:39

final primero veamos el valor que se le

play18:42

resta si les resulta un poco raros esos

play18:44

símbolos es porque en realidad Este es

play18:46

otro truco llamado bit shifting para

play18:49

entenderlo imaginemos primero un número

play18:51

por decir

play18:53

4270 si te pido que lo dividas entre 13

play18:56

probablemente ocuparás de una

play18:57

calculadora Pero si te digo que lo

play18:59

dividas Entre 10 es muy fácil todo No

play19:02

simplemente quitamos el último dígito

play19:05

Eso es así porque estamos dividiendo un

play19:07

número de base 10 entre un valor que es

play19:09

la misma base y pues eso ese es el

play19:13

simple concepto detrás del bit shifting

play19:15

con la diferencia de que como las

play19:17

computadoras manejan binarios esta

play19:19

operación se realiza en base dos si en

play19:22

base 10 es fácil dividir Entre 10 Pues

play19:25

en base dos es fácil dividir entre dos

play19:28

simplemente quitamos el último dígito

play19:30

este truco funciona perfecto para

play19:32

números binarios que terminan en cer0 ya

play19:35

que quitarlo nos da la mitad exacta Pero

play19:37

no es así cuando el número termina en

play19:39

uno quitar el último dígito en este caso

play19:42

resulta en la mitad truncada esta

play19:44

pequeña imprecisión es aceptable en

play19:46

tanto hemos logrado hacer una división

play19:48

pero sin hacerla

play19:50

realmente para implementarlo en código

play19:52

Se le indica a los bits de I que se

play19:54

mueva un bit hacia la derecha que es

play19:57

básicamente lo mismo que quitar el

play19:58

último dígito esto ahorra hacer

play20:01

divisiones por lo que ahorra también

play20:02

valioso tiempo de

play20:04

procesamiento podríamos haber

play20:06

multiplicado por 0.5 en lugar de hacer

play20:08

todo esto no y es un entero si lo

play20:12

multiplicamos por 0.5 lo volveríamos

play20:14

decimal y no tendría sentido haber hecho

play20:17

todo el paso anterior y bueno Al fin

play20:20

llegamos al número mágico el cual está

play20:23

en base hexadecimal para que se entienda

play20:25

mejor lo convertimos a base 10 Y de paso

play20:27

reemplazamos y * x bits recordando la

play20:30

sección

play20:31

anterior si Seguimos observando

play20:33

detenidamente nos daremos cuenta que

play20:35

esto se parece a la ecuación de

play20:37

aproximación pueden notar las

play20:40

similaridades Exacto Son la misma

play20:43

ecuación todo el código que se ha visto

play20:45

hasta ahora se ha hecho para este Exacto

play20:48

momento para poder implementar esta

play20:50

ecuación en forma de código en C si

play20:53

observan las constantes en la ecuación

play20:55

de aproximación vemos que su resultado

play20:57

determina el número mágico como ya lo

play21:00

conocemos del código podemos encontrar

play21:02

el valor de sigma y así ver qué valor le

play21:05

dieron los creadores del algoritmo

play21:07

Entonces vene al caso preguntarse cómo

play21:10

lo calcularon o de dónde lo sacaron la

play21:14

respuesta es que no se sabe y como el

play21:16

comentario en código solo genera aún más

play21:18

confusión es así que se le ha etiquetado

play21:21

como

play21:22

mágico varios trabajos se han planteado

play21:25

métodos matemáticos de cómo se pudo

play21:26

haber llegado a este valor quizás

play21:29

simplemente fue producto de prueba y

play21:30

error incluso cuando le preguntaron a

play21:32

Gary taroli de dónde salió el número

play21:35

básicamente dijo que no recordaba los

play21:37

detalles es que tal vez este número sí

play21:40

tiene algo de mágico después de todo

play21:42

quién sabe

play21:47

realmente antes de seguir con Newton

play21:49

simplemente toca aclarar que la

play21:51

aproximación que hallamos en la sección

play21:53

anterior en realidad representa un

play21:55

decimal pero se lo sigue viendo como un

play21:57

tipo entero debido al truco del cast por

play22:00

lo que usamos el mismo truco para

play22:01

regresarlo a su valor decimal lo

play22:03

guardamos en y y ahora ya tenemos la

play22:05

aproximación en su valor decimal real

play22:09

con eso aclarado continuamos con el paso

play22:11

final del algoritmo el método de

play22:13

Newton este sirve para hallar una

play22:16

aproximación a la solución O soluciones

play22:18

de una ecuación veamos por ejemplo esta

play22:21

ecuación bien simple tal que queremos

play22:23

hallar la solución a esto sin utilizar

play22:26

calculadora el primer paso es con

play22:28

convertir la ecuación en una función de

play22:30

X de la siguiente

play22:33

manera esto se hace así ya que el método

play22:35

de Newton utiliza una forma gráfica de

play22:37

hallar soluciones a ecuaciones en la

play22:39

Gráfica la solución se encuentra cuando

play22:41

la función FX es igual a 0 o sea cuando

play22:45

corta al eje X en el método de Newton se

play22:48

le da una aproximación inicial Y a

play22:50

partir de esta el método hallará

play22:52

aproximaciones cada vez más y más

play22:54

cercanas por medio de rectas tangentes

play22:57

que sean rectas tangentes es importante

play22:59

porque hay una forma fácil de Hallar las

play23:01

pendientes de este tipo de rectas si se

play23:03

conoce la función original y eso es con

play23:05

la derivada de forma sencilla Esa es la

play23:07

lógica detrás de esta fórmula la cual es

play23:09

parte del método de Newton como se

play23:12

observa ahí está la función original su

play23:15

derivada y la aproximación

play23:17

inicial aplicamos la fórmula en nuestro

play23:20

ejemplo escogiendo una aproximación

play23:21

inicial de

play23:23

1.5 y vemos que solo nos ha tomado dos

play23:26

iteraciones llegar a un valor cercano al

play23:27

real Igualmente haremos el procedimiento

play23:30

pero para la operación que realmente nos

play23:32

importa que es la inversa de la raíz

play23:34

cuadrada una vez que tenemos la función

play23:36

y su derivada pues aplicamos la fórmula

play23:39

operamos y ordenamos hasta que nos queda

play23:41

esta

play23:42

ecuación se parece a algo que ya hemos

play23:44

visto antes pues claro esta ecuación es

play23:48

la que aparece en el código para esto es

play23:50

que se definió trhs y y x2 que bueno la

play23:54

única función que tienen es evitar

play23:55

realizar divisiones recordar también que

play23:58

la primera aproximación ya la hemos

play23:59

hallado y se encuentra en la variable y

play24:02

con esto finalmente se puede implementar

play24:04

el método de Newton en código como

play24:07

pueden notar aquí se ha dejado comentado

play24:09

la segunda iteración y es que si

play24:10

comparamos la precisión del algoritmo

play24:12

completo ya prácticamente es

play24:18

perfecta el nivel tan alto de

play24:20

efectividad de este algoritmo es Gracias

play24:22

más que todo a la aproximación inicial

play24:24

que se encontró con ingeniosos trucos de

play24:26

programación en C un profundo

play24:28

conocimiento de las unidades de memoria

play24:30

de los computadores y un poco de magia

play24:34

quizás todo para darle un toque final

play24:37

matemático de la mano de Newton para

play24:39

refinar aún más esta precisión con esto

play24:42

finalmente podemos dar por terminada

play24:44

esta explicación he intentado ser lo más

play24:47

entendible posible pero pues si tienen

play24:49

aún alguna pregunta por favor no duden

play24:51

en dejar un comentario Gracias Eso es

play24:57

todo than

Rate This

5.0 / 5 (0 votes)

Связанные теги
Quake 3Game EngineInverse Square Root3D GamingAlgorithm MysteryCoding TricksPerformance OptimizationComputer ScienceBinary RepresentationNewton's Method
Вам нужно краткое изложение на английском?