Sunday 26 November 2017

C Flotador Mantisa Opciones Binarias


Tengo un programa que se ejecuta en dos procesadores, uno de los cuales no tienen soporte de punto flotante. Por lo tanto, necesito realizar cálculos puntos utilizando el punto fijo en el que el procesador flotante. A tal fin, Me va a utilizar una biblioteca de emulación de punto flotante. Tengo que extraer primero las señales, mantisas y exponentes de números de punto flotante en el procesador que no admite punto flotante. Por lo tanto, mi pregunta es ¿cómo puedo obtener el signo, mantisa y exponente de un número de coma flotante de precisión simple. Siguiendo el formato de esta figura, Eso es lo que he hecho hasta ahora, pero con la excepción de signos, ni mantisa y exponente son correctas. Creo que, Im algo que falta. pedido Mar 28 de 13 a las 15:00 I39m asumiendo IEEE 754 de 32 bits binarios. ¿Es usted consciente de los temas siguientes (1) El exponente es solicitado, mediante la adición de 127 al exponente real. (2) Todos excepto muy pequeños flotadores están normalizados, y el bit 1 líder de una mantisa normalizada flotador no se almacena. ndash Patricia Shanahan Mar 28 de 13 a las 17:05 There39s ninguna ley que dice que hay que utilizar solamente las cosas para lo que fueron creados originalmente para. De lo contrario la primera wouldn39t plano han utilizado trozos de bicicleta. quotGenerallyquot indefinido ¿Qué hay de esas ocasiones en las que se define, o cuando you39re contento con el comportamiento en una plataforma / situación dada ndash de Alex Feb 28 de 14 a las 11:29 Alex realmente hay una ley que dice que sólo se puede hacer algunas cosas y otras no en C. It39s llama el quotISO / IEC 9899: 2011 specificationquot, coloquialmente conocido como el lenguaje standardquot quotC. Y si eso te dice que lo que hace es indefinido you39re que significa que puede obtener nada a cambio. Un día podría funcionar, el siguiente podría dar un resultado erróneo y aún al día siguiente, sólo podría bloquearse. That39s lo que significa quotundefinedquot. ndash Voo 24 de febrero a las 19:08 Este método falla cuando 1) flotante no cumpla la norma IEEE 754 de 32 bits binarios (no tan raro) 2) sin firmar es de 16 bits (común en el mundo incrustado) 3) endian de unsigned47float no coinciden. (raro). 4) la interpretación matemática se utiliza para exponent47mantissa como esta respuesta muestra el exponente sesgado y la mantisa incompleta / mantisa. ndash Chux 5 el Mar 17:34 Descubre el formato de los números de coma flotante utilizado en la CPU que se apoya directamente en coma flotante y descomponerlo en aquellas partes. El formato más común es el IEEE-754. Como alternativa, puede obtener aquellas partes que utilizan algunas funciones especiales (doble frexp (el doble de valor, int exp) y el doble ldexp (doble x, int exp)) como se muestra en esta respuesta. Mi consejo es que se adhieren a gobernar 0 y no rehacer lo que ya lo hacen las bibliotecas estándar, si esto es suficiente. Miran math. h (cmath en C estándar) y funciones frexp, frexpf, frexpl, que rompen un valor de punto flotante (double, float o long double) en la mantisa y exponente parte. Para extraer el signo de la mantisa puede utilizar signbit, también en math. h / cmath, o copysign (sólo C11). Algunas alternativas más ligeras, con la semántica diferentes, son modf y ilogb / scalbn, disponible en C11 en. cppreference / w / CPP / numérico / matemáticas / logb los compara, pero me dio encontrar en la documentación de cómo todas estas funciones se comportan con / - inf y NaNs. Por último, si realmente desea utilizar máscaras de bits (por ejemplo, que necesita desesperadamente saber los bits exactos, y su programa puede tener diferentes NaNs con diferentes representaciones, y usted no confía en las funciones anteriores), por lo menos hacer que todo independiente de la plataforma mediante el uso de la macros en float. h / cfloat. Respondió 26 de Oct 13 a las 16:12 Youre AMP ing los bits erróneos. Creo que desee: Recordar, cuando AMP. usted está poniendo a cero los bits que usted no ha establecido. Así que en este caso, desea poner a cero el bit de signo cuando llegue el exponente, y quiere poner a cero el bit de signo y el exponente al obtener la mantisa. Tenga en cuenta que las máscaras vienen directamente de la imagen. Por lo tanto, la máscara exponente se parecerá a: 0 11111111 00000000000000000000000 y la máscara de mantisa se parecerá a: 0 00000000 11111111111111111111111 respondieron 28 de Mar 13 a las 15:07 Todavía don39t obtener resultados correctos. ndash MetallicPriest Mar 28 de 13 a las 15:10 MetallicPriest Pruebe ahora, que tenía las máscaras mal la primera vez. ndash Xymostech Mar 28 de 13 a las 15:12 ¿Qué pasa con la llamada poco escondido que don39t veo a nadie lo puso: m 0x00800000. Tenga en cuenta que el número debe ser revisado para valores especiales (denormals, Nan, infinidades) primero, ya que estas requieren un tratamiento diferente. ndash Rudy Velthuis Mar 29 de 13 a las 22: 16Floating punta de 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 poner adelante 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. Thomas Finley 2000You puede descargar este artículo en un archivo RTF o Word 97. En este artículo se aplica a todas las versiones de Microsoft Excel para Windows. Este artículo fue escrito por Chip Pearson, 27-Oct-1998. Derechos de autor, 1998, 1999, Charles H. Pearson Este artículo describe las razones por las que puede experimentar errores aritméticos en Microsoft Excel 97. Contenido del artículo: Los valores actuales y se muestran Floating Point funciones de hoja de números para el redondeo de Coma flotante IEEE Standard En este artículo se supone que está familiarizado con lo siguiente: la aplicación Excel Visual Basic para Aplicaciones (VBA) conceptos de programación Los sistemas binarios de números puede haber ocasiones que el valor que se ve en una hoja de cálculo de Excel no es igual al valor que usted cree que debería ser. En general, existen dos posibles causas de este problema. La primera es que los números no se muestran a su valor completo. El segundo es un problema de diseño por ordenador. Ninguno de los dos son quotbugsquot o problemas con el diseño de Microsoft Excel o Windows. números de Excel almacena de forma diferente que ellos pueden tener el formato de visualización de la hoja de cálculo. En circunstancias normales, Excel almacena los valores numéricos como números quotDouble flotante de precisión Pointquot, o quotDoublesquot para abreviar. Estas son las variables de 8 bytes que puede almacenar números exactos de aproximadamente 15 cifras decimales. Es posible que tenga sólo dos cifras decimales que aparecen en la hoja de trabajo, pero el valor subyacente tiene las 15 cifras decimales completos. El segundo problema surge del hecho de que una computadora, cualquier ordenador, no puede almacenar números más fracciones con una precisión total. Ordenadores, en general, utilizan el IEEE (Instituto de Ingenieros Eléctricos y Electrónicos) estándar para los números de punto flotante. Esta norma proporciona una manera de almacenar números fraccionarios en el limitado espacio de un número de 8 bytes. Por supuesto, para la mayoría de los números, se debe hacer alguna aproximación. En este artículo se describe y explica las causas de los errores que se deben a alguna de las causas descritas anteriormente: el número que se muestra con formato y los errores internos asociados con números de punto flotante. Los valores reales y se muestran en circunstancias normales, Excel siempre almacena y manipula los números como números de 8 bytes quotDouble flotante de precisión Pointquot, o quotDoublesquot. Sobresale el almacenamiento interno del número no se ve afectada por la forma en que usted puede elegir para dar formato a un número para su visualización. Por ejemplo, si una celda contiene la fórmula 1/3. Excel siempre trata a este valor como 0,3333133, independientemente del número de posiciones decimales que se elige para mostrar en la hoja de cálculo. Incluso si usted elige para mostrar el valor tan simple quot0.3quot, Excel todavía conserva el número completo como el valor de la celda. Esto puede provocar situaciones en las que puede parecer que Excel está haciendo un error de cálculo, cuando en realidad no lo es. Por ejemplo, supongamos que tenemos la fórmula 1/3 en cada una de las tres celdas A1: A3. Formateo de estas células para un punto decimal mostraría quot0.3quot en cada celda. La incorporación de estos tres celdas junto con la función suma dará el resultado 1.0. Pero es igual a 0,3 0,3 0,3 0,9 1,0 no, a la derecha El resultado parece ser incorrecta. Por supuesto, no lo es. Independientemente de cómo se tiene las celdas con formato de pantalla, Excel utiliza el valor subyacente al hacer los cálculos. En el ejemplo, usted no está realmente agregando 0,3 0,3 0,3. sino más bien ,333333333333333 ,333333333333333 ,333333333333333. cuya suma es (casi) 1.0. Excel no ofrece una opción llamada quotPrecision Como Displayedquot, que se puede activar desde la pestaña C alculate en el diálogo (menú Herramientas) Opciones. La activación de esta opción fuerza Excel para utilizar los valores que se muestran en sus cálculos, en lugar de los números subyacentes. Con esta opción activada, el ejemplo anterior de hecho sumarían a 0,9. Hay que tener mucho cuidado al usar esta opción, sin embargo. Una vez habilitado, toda precisión se pierde y no se puede recuperar. Todas las células se calculan en base al valor mostrado. Esta opción se aplica a todo el libro, no a una celda específica o rango de celdas. Números de punto flotante de Excel, como casi todos los demás programas de ordenador, utiliza el estándar IEEE para números de doble precisión de coma flotante. Esta norma se describe en detalle, a nivel de bits, en una sección posterior de este artículo. Podemos generalizar que, sin embargo, para describir cómo Excel almacena números fraccionarios. Al igual que los ordenadores almacenan números enteros como números binarios, que almacenan números fraccionarios como fracciones binarias. Los ordenadores para almacenar un valor entero (número entero) como (x1 x2 x4 x8 x16 etc) donde x es el estado del bit. Si el bit está activado, x1. Si el bit de apagado, x0. En esta notación, cualquier número entero se puede almacenar exactamente. Por ejemplo, el número 13 se almacena en binario como 1101 que indica, leyendo de izquierda a derecha, 18 14 02 11 13. números fraccionarios se almacenan de una manera similar. En el sistema binario, números fraccionarios se almacenan como la suma de una serie de fracciones: (x1 / 2 x1 / 4 x1 / 8 x1 / 16 etc) donde x es el estado del bit. Si el bit está activado, x1. Si el bit de apagado, x0. A diferencia de los números enteros, sin embargo, no todos los valor fraccionario se puede almacenar exactamente con precisión. Por ejemplo, es imposible para almacenar el número 1/10 0.1 en forma binaria. Una buena aproximación es (01/2 01/4 01/8 11/16 11/32 etc). Computers llevan esta operación para el equivalente de 15 cifras decimales. Incluso con esta precisión, muchos números se representan como una aproximación de su valor o quottruequot quotanalyticquot. Por ejemplo, es imposible describir con precisión el número 1/10 en 8 bytes (o cualquier longitud) notación binaria. números de punto flotante pueden venir muy cerca de lo que representa ese número, pero siempre habrá algún error muy pequeño. Es importante señalar que estos errores y limitaciones en números fraccionarios no son realmente errores en absoluto. Tampoco son quotbugsquot en los programas. Estos son bien conocidos y limitaciones de los sistemas de aritmética de punto flotante bien documentados en el paquete de casi todos los software y dispositivo de hardware. Funciones de hoja de cálculo Excel para el redondeo le brinda varias funciones para manejar el redondeo. Estas funciones son las siguientes. INT REDOND. MULT REDONDO REDONDEAR. MENOS REDONDEAR. MAS TRUNCAR NOTA: La función REDOND. MULT es parte de las herramientas para análisis Add-In para Excel. Debe tener este paquete instalado para poder utilizar estas funciones. Para instalar el ATP, vaya al menú Herramientas, seleccione Complementos. y colocar una marca junto al elemento Herramientas para análisis. Consulte la ayuda en línea para obtener más información sobre estas funciones. IEEE Standard Punto Flotante de la sección se describe el formato interno de las variables de punto de 64 bits flotante de doble precisión. El diseño de un doble es el siguiente: El tamaño 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. P. ej.

No comments:

Post a Comment