Float Point Number Opciones Binarias De Representación


Punto Flotante Thomas Finley, abril de 2000 Índice e Introducción Este documento explica el estándar de punto flotante IEEE 754. En él se explica la representación binaria de estos números, cómo convertir a decimal de coma flotante, cómo convertir de coma flotante a decimal, se analizan los casos especiales en coma flotante, y finalmente termina con algo de código C para promover la comprensión de los de punto flotante. Este documento no incluye las operaciones con números en coma flotante. Escribí este documento de manera que si usted sabe cómo representar, se puede omitir la sección de representación, y si usted sabe cómo convertir a decimal de precisión simple, puede saltarse esa sección, y si usted sabe cómo convertir a la precisión simple de decimal, se puede saltar esa sección. Representación En primer lugar, saber que los números binarios pueden tener, si perdonáis a los interminables que lo diga, un punto decimal. Funciona más o menos de la misma manera que el punto decimal hace con números decimales. Por ejemplo, el decimal 22.589 no es más que 22 y 510 -1 810 -2 910 -3. Del mismo modo, el número binario 101.001 es simplemente 12 2 02 1 12 0 02 -1 02 12 -2 -3. o más bien simplemente 2 2 2 0 2 -3 (este número en particular resulta ser 9.125, si eso ayuda a su forma de pensar). En segundo lugar, saben que los números binarios, como los números decimales, se pueden representar en notación científica. P. ej. El decimal 923.52 se puede representar como 9.2352 10 2. Del mismo modo, los números binarios puede expresarse de esa manera también. Digamos que tenemos el número binario 101.011,101 (que es 43.625). Esto se representa usando la notación científica como 1,01011101 2 5. Ahora estoy seguro de que el entendimiento es perfecto, por fin puedo entrar en la representación. La precisión simple unidad de coma flotante es un paquete de 32 bits, divididas en tres secciones uno bits, ocho bits, y veinte y tres bits, en ese orden. Voy a hacer uso del número binario se ha mencionado anteriormente 1,01011101 2 5 para ilustrar cómo se podría tomar un número binario en notación científica y representarla en notación de coma flotante. Si convertimos simplemente de hex a binario, 0x64 es 0110 0100, que es el mismo resultado que el producido 011.001 anteriormente. Este método es mucho más rápido. De todos modos Tomamos esos números que obtuvimos, y los representamos como 0.011001, de colocarlos en el orden en que los adquirieron. Poner en secuencia con nuestra representación binaria de 329, obtenemos 101001001.011001. En nuestra notación científica binaria, esto es 1.01001001011001 2 8. A continuación, utilizar lo que sabemos acerca de cómo los números de precisión simple se representan para completar este proceso. El signo es positivo, por lo que el campo signo es 0. El exponente es 8. 8 127 135, por lo que el campo exponente es 10000111. La mantisa es simplemente 01001001011001 (Recuerde que la implícita 1 de la mantisa significa que nosotros no incluir el principal 1) más Sin embargo muchos 0s tenemos que añadir a la derecha para hacer que el número binario de 23 bits de longitud. Dado que uno de los problemas de la tarea consiste en representar esto como hexagonal, voy a terminar con un número hexadecimal. Luego nos dividimos en cuatro piezas de bits (ya que cada dígito hexadecimal es el equivalente de 4 bits) y luego convertir cada cantidad de cuatro bits en el dígito hexadecimal correspondiente. Por lo tanto, en hexadecimal, este número es 0x43A4B200. Números especiales A veces, el equipo siente la necesidad de proponer un resultado de un cálculo que refleja que se han hecho algunos errores. Tal vez la magnitud del resultado de un cálculo era mayor o menor que este formato parece ser capaz de soportar. Tal vez se ha intentado dividir por cero. Tal vez usted está tratando de representar a cero ¿Cómo tratar con estas cuestiones la respuesta es que hay casos especiales de los números de punto flotante, específicamente cuando el campo exponente es todos los bits 1 (255) o todos los bits 0 (0). Desnormalizado Números Si usted tiene un campo exponente es todos sus bits de cero, esto es cuál es llamado un número sin normalizar. Con el campo exponente igual a cero, se podría pensar que el exponente real sería -127, por lo que este número podría tomar la forma de 1.MANTISSA 2 -127 como se ha descrito anteriormente, pero no es así. En cambio, es 0.MANTISSA 2 -126. Observe que el exponente ya no es el valor del campo exponente menos 127. Es simplemente -126. También notamos que ya no incluimos un implícito un bit para la mantisa. A modo de ejemplo, tomar el número de coma flotante representado como 0x80280000. En primer lugar, convertir esta a binario. Nuestro bit de signo es 1, por lo que este número es negativo. Nuestra exponente es 0, por lo que sabemos que este es un número sin normalizar. Nuestra mantisa es 0101, lo que refleja un verdadero mantisa de 0,0101 recordamos nosotros no incluir lo que antes era una implícita un bit para un exponente de cero. Por lo tanto, esto significa que tenemos un número -0,0101 -0,3125 2 2 10 -126 -126 -1.25 2 10 2 -128. Cero Usted puede pensar en cero como simplemente otro número sin normalizar. Zero está representado por un exponente de cero y una mantisa de cero. De nuestra comprensión de los números no normalizados, esto se traduce en 02 -126 0. Este bit de signo puede ser positivo (0) o negativo (1), que conduce a ya sea un cero positivo o negativo. Ésto no tiene mucho sentido matemáticamente, pero se permite. Infinity Al igual que el caso de todos los bits cero en el campo exponente es un caso especial, por lo que es el caso de todos los bits uno. Si el campo de exponente es todo unos, y la mantisa es todo ceros, a continuación, este número es una infinidad. No puede haber infinitos, ya sea positivo o negativo dependiendo del bit de signo. Por ejemplo, 0x7F800000 es infinito positivo, y 0xFF800000 es infinito negativo. NaN (no un número) Estas cantidades especiales tienen un campo exponente de 255 (todos los bits uno) como el infinito, pero difieren de la representación del infinito en que la mantisa contiene algunos bits de uno. No importa dónde se encuentren o cuántos de ellos hay, con tal de que hay algunos. El bit de signo parece tener nada que ver con esto. Ejemplos de esto incluyen 0x7FFFFFFF cantidad especial, 0xFF81ABD0, 0x7FAA12F9, y soforth. Resumen de los Casos especiales Un resumen de casos especiales se muestra en la siguiente tabla. Es más o menos una copia de la tabla que se encuentra en la página 301 de la segunda edición de la Organización de informática y diseño, el software de interfaz de hardware por Patterson y Hennessy, el libro de texto de Ciencias de la Computación 104 en el semestre de primavera de 2000. A pesar de que solamente estaba cubierta de precisión simple en el texto anterior, incluyo doble precisión en aras de la exhaustividad. Cuándo, dónde, y dónde no Cuando tiene operaciones como 0/0 o restando el infinito desde el infinito (o algún otro tipo de cálculo ambigua), obtendrá NaN. Cuando se divide un número por cero, obtendrá una infinidad. Sin embargo, lo que representa para estas operaciones especiales requiere algún esfuerzo adicional por parte del diseñador, y puede dar lugar a operaciones más lentas a medida que más transistores se utilizan en el diseño de chips. Por esta razón a veces CPUs no tienen en cuenta para estas operaciones, y en lugar de generar una excepción. Por ejemplo, cuando trato de dividir por cero o hacer operaciones con el infinito, el ordenador genera excepciones y se niega a completar la operación (mi equipo tiene un procesador G3 o MPC750). Ayudante de software Si usted está interesado en investigar más a fondo, que incluyen dos programas para los que proporciono el código C que se puede ejecutar para obtener una mayor comprensión de cómo funciona flotante de punto, y también para comprobar su trabajo en varias tareas. Hex 2 Flotador Este programa acepta como entrada una cantidad hexadecimal y lo lee como datos en bruto en el theFloat variable. Entonces, el programa da salida a la representación hexadecimal de los datos en theFloat (la repetición de la entrada), y las impresiones que junto a la cantidad de coma flotante que representa. Muestro aquí una muestra de ejecución del programa. Note las cantidades de puntos de caso especial flotantes (0, infinito, y no un número). Para eliminar la normalización de los números pero no cero, este programa mostrará cero a pesar de que el número no es realmente cero. Si desea solucionar este problema, reemplace el f de la cadena de formato de la función printf con el correo, que deplay el número de gran precisión con la notación científica. Yo no lo tenía como el correo porque me resulta muy molesto notación científica. Flotador 2 Hex Esta es una ligera modificación del programa de flotadores Hex 2. La excepción es que se lee en un número de coma flotante. Al igual que la forma y da salida hexadecimal más el número de coma flotante. De nuevo incluyo una muestra de ejecución de este programa, lo que confirma los resultados de los problemas de ejemplo he cubierto al principio de este texto, junto con algunos otros casos sencillos. Note la representación hexadecimal de 0,2. Y ese es el final de ese capítulo. tamaño Thomas Finley 2000Los de un flotador es dependiente de la plataforma, aunque un máximo de 1.8e308 con una precisión de aproximadamente 14 dígitos decimales es un valor común (el 64 bit formato IEEE). Los números de punto flotante de precisión de punto flotante de precisión han limitado. Aunque depende del sistema, PHP normalmente utiliza el formato de doble precisión IEEE 754, lo que dará un error relativo máximo debido al redondeo en el orden de 1.11e-16. operaciones aritméticas elementales no pueden dar errores más grandes, y, por supuesto, debe tenerse en cuenta la propagación de errores cuando se combinan varias operaciones. Además, los números racionales que son exactamente representable como números en coma flotante en la base 10, como 0,1 o 0,7. no tienen una representación exacta como números en coma flotante en la base 2, que se utiliza internamente, sin importar el tamaño de la mantisa. Por lo tanto, no pueden ser convertidos en su representación binaria interna sin una pequeña pérdida de precisión. Esto puede conducir a resultados confusos: por ejemplo, suelos ((0.10.7) 10) normalmente devolverá 7 en lugar del 8 esperado. ya que la representación interna será algo así como 7.9999999999999991118. . Así que nunca confía en número flotante resultados al último dígito, y no se pueden comparar directamente los números de punto flotante por la igualdad. Si es necesario una mayor precisión, las funciones matemáticas de precisión arbitraria y funciones gmp están disponibles. Para una explicación quotsimplequot, ver las that039s guía de punto flotante raquo también titulado quotWhy dont mis números se suman upquot Conversión a flotar Para obtener información sobre la conversión de la cadena s es variable. ver Conversión de cadenas a números. Para valores de otros tipos, la conversión se lleva a cabo mediante la conversión del valor a entero primero y luego a flotar. Consulte Conversión de número entero para obtener más información. A partir de PHP 5, una noticia es generada si un objeto se convierte a flotar. La comparación de los flotadores Como se señaló en la advertencia anterior, poniendo a prueba los valores de punto flotante por la igualdad es problemático, debido a la forma en que se representan internamente. Sin embargo, hay maneras de hacer comparaciones de los valores de los puntos que trabajan en torno a estas limitaciones flotante. Para probar valores de coma flotante por la igualdad, un límite superior en el error relativo debido al redondeo se utiliza. Este valor se conoce como la epsilon de la máquina, o de la unidad de redondeo, y es la diferencia más pequeña aceptable en los cálculos. a y b son iguales a 5 dígitos de precisión. ltphp un 1.23456789 1.23456780 b épsilon 0,00001 si (abs (a - b) lt épsilon) echo cierto gt NaN Algunas operaciones numéricas pueden resultar en un valor representado por la constante NAN. Este resultado representa un valor indefinido o no representable en los cálculos de punto flotante. Cualquier comparación estricta o de este valor con cualquier otro valor, incluido él mismo, tendrán un resultado de falso. Debido a NAN representa cualquier número de diferentes valores, NAN no debe ser comparado con otros valores, incluyendo en sí, y en su lugar se debe comprobar para el uso de isnan (). Notas de usuarios 30 notas sólo un comentario sobre algo que el punto flotante de precisión inserción, que dice: esto está relacionado con. 0,3333333. Mientras que el autor probablemente sabe lo que están hablando, esta pérdida de precisión no tiene nada que ver con la notación decimal, tiene que ver con la representación como un binario de punto flotante en un registro finita, como mientras que 0,8 termina en decimal, es la repetición de ,110011001100. en binario, que es truncada. 0,1 y 0,7 son también no termina en binario, por lo que también se truncan, y la suma de estos números truncados no se suman a la representación binaria truncada de 0,8 (que es la razón (piso) (0.810) se obtiene un diferente, más intuitivo, como resultado). Sin embargo, desde 2 es un factor de 10, cualquier número que termina en binario también termina en decimal. toque la informática general: Si usted es no perder de vista el dinero, hacer usted mismo y sus usuarios el favor de manejar todo internamente en centavos y hacer tanto matemáticas como puedas en números enteros. almacenar valores en centavos, si es posible. Sumar y restar en céntimos. En cada operación que wii implican flotadores, preguntarse qué va a pasar en el mundo real si recibo una fracción de un centavo aquí, y si la respuesta es que esta operación va a generar una transacción en céntimos enteros, no trate de llevar a la precisión fraccionaria de ficción que sólo se enredar las cosas más adelante. ltphp binarydata32 paquete (H. 00000000) float32 desempaquetar (f. binarydata32) // 0.0 binarydata64 paquete (H. 0000000000000000) float64 desempaquetar (d. binarydata64) // 0.0 gt consigo 0 tanto para los números de 32 bits y de 64 bits. Pero, por favor, no use sus propias funciones para convertir de float a binario y viceversa. Looping rendimiento en PHP es horrible. El uso de paquetes / desempaquetar utiliza procesadores de codificación, que siempre es correcta. En C se puede acceder a los mismos datos de 32/64, ya sea como flotador / doble o número entero de 32/64 bits. No hay conversiones. Para obtener la codificación binaria: ltphp float32 paquete (. F 5300231) binarydata32 desempaquetar (H. float32) // 0EC0A14A float64 paquete (. D 5.300.231) binarydata64 desempaquetar (H. float64) // 000000C001385441 GT y mi ejemplo desde hace medio año: ltphp binarydata32 paquete (H. 0EC0A14A) float32 desempaquetar (f. binarydata32) // 5300231 binarydata64 paquete (H. 000000C001385441) float64 desempaquetar (d. binarydata64) // 5300231 GT y agradar a la mente el grande y niños pequeños endian. Id como para señalar una característica de los PHP apoyo punto que isnt claro en cualquier lugar aquí, y me estaba volviendo loco flotantes. Esta prueba (donde dice que vardump A0.1 y b0.1) si (AGTB) bla eco fallará en algunos casos debido a la precisión oculta (C estándar problema, que los documentos de PHP no mencionan, por lo que supuso que se había deshecho de la misma). Debo señalar que en un principio pensé que esto era un problema con los flotadores están almacenados como cadenas, por lo que los obligó a ser flotadores y todavía no pudimos evaluar adecuadamente (probablemente 2 problemas diferentes allí). Para solucionar, he tenido que hacer esto kludge terrible (la equivelant de todos modos): si (redonda (a, 3) gtround (b, 3)) bla echo esto funciona. Obviamente, a pesar de que vardump dice que las variables son idénticos, y que deben ser idénticos (comenzando a 0,01 y 0,001 añadido en varias ocasiones), theyre no. Theres un poco de precisión oculto que no me hacía desgarro mi pelo. Tal vez esto se debe agregar a la documentación En algunos casos es posible que desee obtener el valor máximo para un flotador sin conseguir INF. vardump (1.8e308) generalmente mostrará: flotador (INF) me escribió una función pequeña que va a recorrer con el fin de encontrar el valor flotante más grande no infinita. Viene con un multiplicador valores configurables y afines para que pueda compartir más CPU para obtener una estimación más precisa. No he visto mejores valores con más afín, pero bien, la posibilidad está aquí, así que si realmente lo que vale la pena el tiempo de CPU, sólo tratar de affiné más. Los mejores resultados parecen ser con mul2 / affine1. Se puede jugar con los valores y ver lo que hay. Lo bueno es que este método funcionará en cualquier sistema. función Floatmax ltphp (mul 2. afín 1) max 1 OMAX 0 while ((cadena) máx INF) para (i 0 i lt afín i) pmax 1 OMAX máximo tiempo ((cadena) máx INF) OMAX max max Pmax Pmax retorno mul OMAX GT Tenga cuidado al usar valores de coma flotante en cadenas que se utilizan como código más tarde, por ejemplo, cuando la generación de código SQL o sentencias de JavaScript. El flotador es en realidad el formato según la configuración local de los navegadores, lo que significa que tendrá como resultado 0,23 0,23. Imagínese que algo como esto: 0,23 x js var foo Dobar (x) imprimir js Esto daría lugar a un resultado diferente para los usuarios con algunos locales. En la mayoría de los sistemas, esto sería imprimir: Dobar var foo (0,23), pero cuando llega por ejemplo a un usuario de Alemania, que sería diferente: Dobar var foo (0,23), que es obviamente una llamada diferente a la función. JavaScript suele indicar un error, argumentos adicionales se descartan sin previo aviso, pero la función de Dobar (a) obtendría 0 como parámetro. Problemas similares podrían surgir en cualquier otro lugar (SQL, cualquier cadena que se utiliza como código de otro lugar). El problema persiste, si se utiliza el. operador en lugar de la evaluación de la variable en la cadena. Así que si usted realmente necesita para estar seguro de tener la cadena con el formato correcto, el uso NumberFormat () para hacerlo yo estaba programando una aplicación de contabilidad en MySQL que me obligó a sumar una colección de flotadores y asegurarse de que son iguales a cero antes de comprometerse una transacción, pero como se ve por encima de una suma de flotadores no siempre pueden ser de confianza (como fue mi caso). Seguí recibiendo una muy pequeña resto (como 1.4512431231e-14). Ya que había utilizado NumberFormat (num, 2) para ajustar la precisión de los números en la base de datos de sólo dos (2) decimales, cuando llegue el momento de calcular la suma simplemente multiplicar cada número por diez (10), eliminando therby y decimales y dejándome con números enteros para preformas mi suma. Esto funcionó muy bien. ltphp / hex2float (convertir el valor hexadecimal de 8 dígitos para flotar (32bits de precisión simple) Acepta 8 dígitos hexadecimales en el uso de una cadena:. hex2float32n (429241f0) devuelve - gt 73.128784179688 / función hex2float (número) sprintf binfinal (032B hexdec (número) ) signo substr (binfinal 0. 1) substr exp (binfinal 1. 8) mantisa 1. substr (binfinal 9) mantisa strsplit (mantisa) exp bindec (exp) -... 127 significand 0 para (i 0 i lt 24 i ) significand (1 / pow (2 i)) mantisa vuelvo pow cifra significativa (2. exp) (signo - 2 1) gt El cuadro de coma flotante de precisión en la práctica significa: lt eco (69,1 piso (69.1)) Gt Think thisll devolver 0,1 eso no tiene - devuelve 0.099999999999994 lt eco redonda ((69.1-baja (69,1))) gt Esto devuelve 0,1 y es la solución que utilizamos Tenga en cuenta que lt eco (4,1-baja (4,1)) gt hace volver 0.1. - por lo que si, como nosotros, probar esto con un número bajo, usted no, como nosotros, entender por qué, de repente, la secuencia de comandos deja de funcionar, hasta que pase mucho tiempo, como nosotros, depurarlo. Por lo tanto, eso es todo precioso a continuación. Una manera eficaz de comparar dos números reales (incluidos los números de punto flotante) con alta precisión y aún así ser capaz de establecer la precisión se utiliza la función de bccomp BC Math () Por ejemplo: ltphp un 1,23456789 b 1,23456780 precisión 5 si (bccomp (precisión ab) 0) echo cierto // true gt ltphp un sprintf (.17f. 0.1 0.2) b 0,3 si (bccomp (AB 17) 0) de la señal perturbadora // gt FALSO Convertir una cadena hexadecimal en un número flotante IEEE 754 de 32 bits. Esta función es 2 veces más rápido que el hexágono abajo para la función de 32 bits. Esta función sólo cambia los tipos de datos (cadena a int) una vez. Además, esta función es un puerto de la hexagonal para la función de 64 bits desde abajo. función ltphp hexTo32Float (strHex) v hexdec (strHex) x (v amplificador ((1 LTLT 23) - 1)) (1 LTLT 23) (v gtgt 31 1) exp (v gtgt 23 amperios 0xFF) - 127 return x pow ( 2. exp - 23) gt ltphp // ejemplo eco hexTo32Float (C4028000) // salidas: -522 eco hexTo32Float (457F9000) // salida: 4089 eco hexTo32Float (2D7F5) // salidas: 6.00804264307E-39 eco hexTo32Float (0002D7F5) // salida: 6.00804264307E-39 eco hexTo32Float (47D9F95E) // salida: 111.602,734375 GT la función devuelve 5 para 5000, porque si no hay un punto decimal, entonces los primeros strpos será falsa, y lt FALSO 1 VERDADERO es lo que la condición será siendo cierto. Debe comprobarse si strpos devuelve una posición válida: la función ltphp str2num (str) si (...... Strpos (str) strpos ampamp FALSO (str,) strpos ampamp FALSO (str) lt strpos (str,)) str strreplace (... str) str strtr (str.,..) strreplace str más (,.. str) de retorno (float) str gt PHP pasa de la notación decimal estándar para la notación exponencial para ciertos flotadores especiales. Se puede ver una lista parcial de tales valores especiales con esto: ltphp para (i tmp 0. 0 i LT 100 i) tmp 100000 eco redonda (TMP), n gt Por lo tanto, si se añaden dos flotadores, terminar con un valor especial , p. ej 1.2E6, a continuación, poner ese valor no modificado en una consulta de actualización para almacenar el valor de una columna decimal, por ejemplo, es probable que obtener una transacción fallida, ya que la base de datos verá 1.2E6 como datos varchar, no decimal. Del mismo modo, es probable que obtenga un error de validación XSD si se pone el valor en XML. Tengo que ser honesto: esta es una de las cosas más extrañas que he visto en cualquier idioma en más de 20 años de codificación, y es un dolor colosal para trabajar alrededor. El era hablar acerca de la conversión de 32 y 64 bits números binarios IEEE754 a PHP flotador. La tampoco cuestión tanto la conversión, puesto que ya están en forma binaria, ya que está proyectando. PHP No permite Acceso directo de memoria, pero todavía se puede conseguir un poco. El derecho era leer los flotadores (32 y 64 bits) es la siguiente: ltphp binarydata32 paquete (H. 0EC0A14A) float32 desempaquetar (f binarydata32.) Binarydata64 paquete (H. 000000C001385441) float64 desempaquetar vardump (float32 float64 (d binarydata64.).. float32 float64) gt el resultado del volcado (): array ltphp (1) 1 gt flotador (5300231) array (1) 1 gt flotador (5300231) bool (true) gt Nota: la mente el grande y niños pequeños endian En MySQL, muchos tipos de números de punto flotante puede tener un rango especificado por medio de 2 valores, la precisión y la escala Ej flotar (precisión, escala) para el tipo de datos. Esta sintaxis significa un número puede ser ltprecisiongt bits de largo, pero sólo puede haber ltscalegt los bits después del punto decimal. P. ej. un (5,2) Campo flotador puede tener los valores -999,99-999,99. Aquí es una función para validar un flotador PHP usando la siguiente sintaxis: ltphp función validatefloat max (float) strpad (precisión - escala 9..) (Flotante de precisión escala..). .. Strpad (escala 9..) Min (float) - max si ((float lt min) (float gt max)) return false otra vuelta verdad GT en el manual gettype (), se dice (por razones históricas doble es devuelto en caso de un flotador, y no simplemente flotar). Sin embargo, creo que PHP internamente a veces usa la doble definición C (es decir, un doble es dos veces el tamaño de un flotador / real). Ver el siguiente ejemplo: // lt función requerida para revertir una cadena en dos bloques de función strrevx (s, x 2) si (x lt 1) strrev retorno (s) de retorno más (implosión (arrayreverse (arraymap (implosionan, arraychunk ( strsplit (s), x))))) echo paquete doble. paquete de TST PHPEOL (d, 1,6) vardump (strrevx (bin2hex (TST))) paquete de TST (d, 8-6,4) vardump (strrevx (bin2hex (TST))) paquete de flotación eco. PHPEOL paquete de TST (f, 1.6) vardump (strrevx (bin2hex (TST))) paquete de TST (f, 8-6,4) (strrevx (bin2hex (TST))) gt vardump (La combinación strrevx-bin2hex es sólo para dar caracteres imprimibles .) Dado que PHP trata de dobles y flota de forma idéntica, Id espera que la misma cadena como de salida, sin embargo, la salida es: cadena de paquete doble (16) 3ff999999999999a // Aquí se ve que hay una diferencia de minutos. string (16) 3ff9999999999998 cadena paquete de flotador (8) 3fcccccd //. el que no lo existe aquí cadena (8) 3fcccccd lo tanto, como una alternativa al uso float1 float2 se podría utilizar el paquete (f, float1) paquete (f, float2) con una gran nota que uno realmente debe recordar que uno está reduciendo la precisión de la comparación. Que yo sepa es ésta la única forma (aparte de los métodos épsilon) para comparar de forma segura dos flotadores. Los cálculos que implican tipos de flotador se vuelven imprecisos cuando se trata de números con aproximadamente más de 8 dígitos que cada vez el punto decimal es. Esto es debido a la forma flotadores de 32 bits se almacenan comúnmente en la memoria. Esto significa que si se basan en los tipos de flotador mientras se trabaja con pequeñas fracciones o números grandes, los cálculos pueden acabar entre diminutas fracciones a varios billones de apagado. Esto por lo general no importará al convertir a la forma de almacenamiento de memoria binaria y editar muchas aplicaciones flotan direcciones de memoria directamente, o hacer frente a los números de menor longitud. Pero si usted está trabajando con números y decimales de mayor escala, lo mejor es cambiar a trabajar con otros tipos: www / manual / en / refs. math Aquí es una función para convertir un flotador-formato exponencial a un flotador-formato decimal, por ejemplo, 1.6e12 al 1600000000000. Esto ayudará a abordar el problema especificado por kjohnson anteriormente. Yo lo he probado, pero no en cualquier situación del mundo real, de modo serían apreciadas ningún / mejoras / correcciones de informes de retroalimentación. ltphp función exptodec (floatstr) // formato a una cadena de números de punto flotante en notación decimal, apoya flotadores firmados, también es compatible con el formato no estándar, por ejemplo, 0.2e2 para 20 // por ejemplo, 1.6E6 al 1600000, -4.566e-12 a -0.000000000004566, 34e10 a 340 mil millones // Autor: Bob // asegurarse de que su una cadena PHP estándar flotador (es decir, cambiar 0.2e2 a 20) // php automáticamente el formato decimal flota si se encuentran dentro de un cierto rango floatstr (cadena) ((float) (floatstr)) // si hay una e en la cadena de flotador si ((strpos de punto de venta (strtolower (floatstr), e)) falso) // obtener ambos lados de la E, por ejemplo, 1.6E6 E6 gt exp, núm 1,6 exp substr (floatstr. Pos 1) num substr (floatstr. 0. pos) // tira fuera de signo numérico, si es que existe, y dejarlo fuera si es (no es necesario) si (( (numsign num 0)) (numsign -.)) num substr (num 1) si otra cosa numsign (numsign) numsign // quitarse señal exponencial (o - como en E6) si es que existe, de lo contrario tirar de error, por ejemplo, E6 gt if (((exp expsign 0)) (expsign -)) exp substr (exp. 1) TriggerError más (No se puede convertir la notación exponencial de notación decimal: inválido floatstr cadena flotador EUSERERROR.) // Obtener el número de decimales a la derecha del punto decimal (o 0 si no hay ningún punto dec), por ejemplo, 1.6 gt 1 rightdecplaces ((decpos strpos (num..)) Falso). 0. strlen (substr (num. Decpos 1)) // obtener el número de decimales a la izquierda de la coma decimal (o la longitud de todo el num si no hay un punto de descomposición), por ejemplo, 1.6 gt 1 leftdecplaces (decpos falsos). strlen (num). strlen (substr (num. 0. decpos)) // funcionó número de ceros de exp, signo de la exp y lugares dec, por ejemplo, exp 6, muestra exp, lugares dec ceros num 1 gt 5 si (expsign) numzeros exp - rightdecplaces demás numzeros exp - leftdecplaces // construir una cadena con ceros, por ejemplo numzeros 0 5 veces gt 00000 ceros strpad (. Numzeros. 0) // decimal franja de num, por ejemplo, 1.6 GT 16 si (decpos falsa) num strreplace (... Num) // si el exponente positivo, al igual que la de regreso si 1600000 (expsign) numsign retorno. num. ceros // si el exponente negativo, vuelven como 0,0000016 numsign retorno más. 0 .. ceros. num // de lo contrario, se supone que ya están en notación decimal y volver otra gt retorno floatstr Como lebkowskiphp m punto en gmail punto com (www / language. types. float81416) observó 9 comentarios a continuación: Cuando PHP convierte en un flotador en una cadena, el separador decimal utilizado depende de las convenciones localización actual. Sin embargo, para declarar un número de coma flotante, se debe utilizar siempre un punto final otherwhise el código sería depende del local (imaginar la pesadilla): ltphp flotar 1.5 // flotador (1.5) flotante 1. 5 // Parse error: error de sintaxis, inesperado, flotante (float) 1.5 // flotador (1.5) flotante (float) // 1,5 flotador (1) GT Ahora, si usted tiene una cadena que contiene un número localizada, se puede convertir de nuevo a un número de coma flotante utilizando la siguiente función: ltphp / convertir una serie de números localizada en un punto de la cuerda flotante número param sNumber la cadena numérica localizada para convertir. volver flotar el número convertido. / Función str2num (sNumber) aConventions localeconv () sNumber ajuste ((cadena) sNumber) bIsNegative (0 aConventions nsignposn ampamp (sNumber ampamp) sNumber) sCharacters aConventions decimalpoint. mondecimalpoint aConventions. aConventions negativesign pregreplace sNumber (/. pregquote (sCharacters). d /.. trim ((cadena) sNumber)) iLength strlen (sNumber) si (strlen (aConventions decimalpoint)) sNumber strreplace (aConventions decimalpoint, .. sNumber) si (strlen (aConventions mondecimalpoint)) sNumber strreplace (aConventions mondecimalpoint, .. sNumber) sNegativeSign aConventions negativesign si (strlen sNegativeSign () ampamp 0 aConventions nsignposn) bIsNegative (sNegativeSign sNumber sNegativeSign sNumber) si (bIsNegative) strreplace sNumber (aConventions negativesign,. sNumber) número f (float) sNumber si (bIsNegative) número f - número f volver número f gt Ejemplo: ltphp setLocale (. LCALL frBE. UTF-8) // separador decimal es ahora un flotador coma - 123456.789 cadena (string) vardump flotante (float) // flotador (-123456,789) vardump (cadena) // cadena (11) -123456,789 vardump ((float) de cadena) // flotador (-123.456) vardump (str2num (cadena)) // flotador (-123456,789) gt también funciona con cadenas devueltas por la función NumberFormat (): ltphp setLocale (LCALL. frBE. UTF-8) // separador decimal es ahora una conv localeconv () flotador coma - 123456.789 cadena conv intcurrsymbol. NumberFormat (float. fracdigits conv, conv decimalpoint, conv thousandssep) vardump (float) // flotador (-123456,789) vardump (cadena) (cadena (float)) // cadena (15) -123.456,79 euros vardump // flotador (0) vardump (str2num (cadena)) // flotador (-123456,79) Convierte gt cadena de configuración regional en el número de flotación ltphp función str2num (str) si (strpos (str.). lt strpos (str.,)) str strreplace (... str) str strtr (str.,..) else strreplace str (,.. str) de retorno (float) str str2num (25,01) //25.01 str2num (2.5,01) //25.01 str2num ( Los valores de punto flotante 25,01) //25.01 str2num (2,5.01) //25.01 gt tienen una precisión limitada. Por lo tanto, un valor que no tenga la misma representación de cadena después de cualquier procesamiento. Eso también incluye escribir un valor de punto flotante en el script y directamente imprimirlo sin ningún tipo de operaciones matemáticas. Si desea saber más acerca de los flotadores y lo IEEE 754 se lee esto: docs. sun / fuente / 806-3568 / ncggoldbergA Tutorial sobre representación de datos enteros, números en coma flotante, y caracteres seres humanos utilizan Sistemas de números decimales (base 10 ) y duodecimal (base 12) sistemas de números para contar y mediciones (probablemente porque tenemos 10 dedos de los pies y dos grandes). Los equipos utilizan binario sistema numérico (base 2), ya que están hechos a partir de componentes digitales binarios (conocido como transistores) que operan en dos estados - encendido y apagado. En informática, también utilizamos hexadecimal (base 16) u octal (base 8) sistemas de numeración, como una forma compacta para representar números binarios. Decimal (base 10) sistema de numeración decimal sistema numérico tiene diez símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9, llamado dígitos s. Se utiliza la notación posicional. Es decir, el dígito menos significativo (dígito del extremo derecho) es del orden de 100 (unidades o unos), más a la derecha segundo dígito es del orden de 101 (decenas), el tercer dígito del extremo derecho es de del orden de 102 (cientos), y así sucesivamente. Por ejemplo, nosotros designaremos un número decimal con un sufijo opcional D si surge la ambigüedad. Binario (base 2) sistema de numeración binario Número de sistema tiene dos símbolos: 0 y 1, denominados bits. También es una notación posicional. -1. -1. -1. y así. respectivamente. P. ej. . 0.1. 0.25. 0.01. 0.001. y así. Haga clic lsquoClearrsquo para restablecer la forma y empezar de cero. Si desea convertir otro número, sólo tiene que escribir el número original y haga clic lsquoConvertrsquo 8212 no hay necesidad de hacer clic lsquoClearrsquo primero.

Comments

Popular posts from this blog

Comisiones De Los Agentes De La Divisa Críticas

Opciones Binarias 0x67

Más Rápido Servicio De Noticias De La Divisa