¿Por qué lenguaje de programación informática: no es igual a 0,1 + 0,2 0,3

JS descubierto recientemente en el proceso de aprendizaje se encontró en el ordenador JS una cosa muy interesante, no es el resultado de 0,1 + 0,2 0,3, pero ,30000000000000004, pero primero y luego añadir la fracción multiplicar y dividir volvieron a obtener el deseado 0,3

 

 Lo he probado con una serpiente pitón, que se encuentra pitón es la misma, el resultado es ,30000000000000004.

 Entonces empecé a recopilar información, y finalmente encontré la respuesta. ¿Quieres saber la razón por la cual, primero debemos entender estos puntos: binario, exponenciales, las normas IEEE 754.

 1, binario

Todos los datos en el ordenador se almacenan en forma binaria, incluyendo número entero, punto flotante, y todos los otros tipos de datos. Vamos a decimal a binario 0,1 y 0,2

El método es la conversión relativamente simple, convertida en entero binario: 2 y se divide por un número entero de redondeo hasta el resto, de, por ejemplo a 100 en la figura.

 

 a continuación, se convierte en decimal binario, la parte decimal 2 se multiplica por el infinito, a continuación, el redondeo de forma secuencial. Ejemplo 0.375 usando la FIG.

 

 

 

 2, exponenciales

Representar un valor mayor se puede almacenar en un espacio limitado con forma exponencial.

 

Todo número decimal puede ser expresado por una forma exponencial, se convierte en M * 105 = D E , tal como 100 se puede expresar como 1 * 2 .

número binario puede ser representado por una forma exponencial, M = B * 2 E forma, donde E es el exponente, siendo M el número de bits B. Tal como 0.011 pueden ser representados como 1,1 × 10 -10 "-10" -2 representado aquí.

 

3, punto flotante estándar IEEE754

JavaScript comprende todos los números en enteros y los decimales son sólo un tipo, sigue el estándar IEEE 754, que se utiliza para representar el 64 bits de longitud fija, que es el doble de la de coma flotante de precisión doble estándar.

 

 

 Aquí está el primer bit de signo "1" representa una negativa, "0" representa un número positivo

 

A primera conversión de decimal a binario 0,1: ,0011001100110011 ......

 

 

 

Se convierte entonces en un decimal binario 0,2: ,0011001100110011 ........

 

 

 

En segundo lugar, el 0,1 y 0,2 conversión de forma exponencial binario

Decimal: 0,1

forma binaria: 0.000110011001100110011 ......

forma exponencial: 1.10011001100110011 ...... * de 2- 100           // índice de -4

 

Decimal: 0,2

forma binaria: 0.001100110011001100110011 ......

forma exponencial: 1.100110011001100110011 ...... * 2 -11      // índice -3

 

En tercer lugar, el índice de conversión en forma de IEEE754 estándar

Porque aquí IEEE754 previsto por la norma de la mantisa sólo puede contener 52, que hay que hacer infinitos decimales son redondeadas, dejando sólo el 52 decimal (es decir, después de todo, renunciar a la primera 53, segunda 53, "0 y redondeando 1", y cuando el primer 52 a 1 y, a continuación, tienen que entrar a)

 

 

 

 

 

0.2 para convertir decimal a la IEEE 754 estándar:

 

 

 

En cuarto lugar, la forma de uso de IEEE 754 0,1 + 0,2

 

 

 Esto es demasiado largo, entonces debería ser fácil de escribir es 10,0100100100100100100100100100100 ...... 100111, pero esta vez el número de índice resultante es todavía exponencial, lo quieres convertir en forma binaria, el punto decimal es avanzar para convertirse en tres 0.01001001001001001001001 ..... 00111

Que luego se convierte a número decimal es 0 * 2 -1 + 1 * 2- 2 + 0 * 2 -3 + 0 * 2 -4 ....... + 1 * 2 -52 a continuación, se puede obtener ,30000000000000004 la

 

Todo se reduce a esto:

Computer almacenar datos debido al espacio limitado, sólo el almacenamiento de datos de longitud fija, algunos de los datos como un bucle sin fin puede ser redondeado, y por lo que algunos datos pueden en sí tiene cierto error, el error tendrá que hacer la operación de adición .

 

Entonces mira el pasado (0,1 * 10 + 0.2 * 10) / 3 es igual a la razón por la 10, 0,1 y 0,2 hacer en primer lugar ya que se convierte en la multiplicación de enteros, a continuación, un vistazo a la adición entero entre.

 Finalmente 3/10 y luego conseguimos un 0,3, no estoy preguntando cómo este recuento, directamente Calculadora -..-

 

 

 

 

 

 

 




Supongo que te gusta

Origin www.cnblogs.com/hai-long/p/12552148.html
Recomendado
Clasificación