2011-08-05 14 views
7

Actualmente estoy tratando de encontrar la manera de trabajar con números de precisión arbitraria en PHP. Así que supongo que mi primera pregunta sería qué es exactamente matemática de precisión arbitraria. Intenté buscar en Google una buena definición, pero por alguna razón nadie puede expresarlo en palabras suficientemente simples.Matemáticas de Precisión Arbitraria en PHP

En segundo lugar, ¿cuáles son las diferencias entre las bibliotecas BCMath y GMP en PHP? Escuché afirmaciones de que la API de GMP es "más reciente", pero idk. ¿Es uno mejor?

Y mi pregunta final sería qué tipo de números toma BCMath/GMP. Obviamente, toma números enteros normales en forma de cadena (por ejemplo, "5.34"), pero he visto implementaciones donde las funciones de BCMath se han utilizado directamente con cadenas de octetos que representan enteros regulares (por ejemplo, "\ x12 \ x23 \ x45 \ x67"), que He oído que me llaman "bigint", pero de nuevo, Google no me ha dado nada.

+0

En teoría ambos permiten números de cualquier longitud para ser usados, siempre y cuando estén alimentados a la biblioteca como cadenas. Todo se reduce a lo que tenga la mejor API para sus propósitos. bc funciona puramente con cadenas, mientras que gmp puede aceptar cadenas pero también usa sus propias representaciones internas. –

+0

Nota: para trabajar con aritmética de precisión arbitraria, puede usar una biblioteca como [brick/math] (https://github.com/brick/math) que utiliza GMP, BCMath o incluso PHP sin formato de forma automática. dependiendo de la disponibilidad de cada extensión De esta forma, no tiene que elegir entre GMP y BCMath, y tiene una API de OO agradable para jugar. – Benjamin

Respuesta

12

¿qué es exactamente arbitrary-precision math?
aritmética de precisión aritmética aka "bignum math", introduce una forma de realizar operaciones aritméticas en números cuyo número de dígitos solo está limitado por la cantidad de memoria disponible. Esto se debe a la aritmética de precisión fija proporcionada por las CPU/ALU de los sistemas host y donde el tamaño/precisión máxima del número representado es un factor del número de bits de los registros de estos procesadores de hardware.

La aritmética de precisión fija es rápida, eficiente con respecto al almacenamiento y está incorporada/disponible universalmente. Sin embargo, es aplicable a rangos numéricos limitados (aunque solo algunas veces "suficientemente grandes"). La aritmética aritmética de precisión es más lenta, algo desperdiciada en el almacenamiento y requiere bibliotecas especializadas como GMP o BCMath.

¿cuáles son las diferencias entre el BCMath y bibliotecas GMP
La diferencia más sobresaliente es que GMP trabaja en [precisión arbitraria] enteros valores, mediante el cual BCMath permite [precisión arbitraria] decimal/flotador como valores
Ni API es difícil de aprender, pero BCMath puede ser un poco más intuitivo (además de apoyar valores float-like)

la selección de una de una biblioteca particular sobre otro uno típicamente es accionado por el uso previsto (o por la disponibilidad en una plataforma dada). Hasta que no se involucre en las aplicaciones de MP, la mayoría de las bibliotecas se ajustarán a la factura y serán generalmente equivalentes (dentro de su clase, por supuesto, es decir, evite la biblioteca de solo números enteros si necesita números en coma flotante).

qué tipo de números toma BCMath/GMP?
Al igual que con la mayoría de los paquetes matemáticos de precisión, estas dos bibliotecas utilizan cadenas para su API, es decir, para representar sus valores numéricos de entrada y salida.
Internamente ... Algunos paquetes como GMP tienen su propia representación para los números. Lo específico de tales estructuras suele ser un compromiso entre minimizar los requisitos de almacenamiento y permitir cálculos rápidos (incluido el de "serializar/deserializar" tales estructuras a/desde archivos de texto).
El ejemplo "\x12\x23\x45\x67" en la pregunta se conoce como BCD es decir, código binario Decimal. Permite almacenar 2 dígitos decimales por byte y algunas veces es utilizado por Arbitrary Precision Arithmetic libraries.

+0

¡Gracias por la respuesta! Solo tengo dos cosas más para aclarar. ¿Hay alguna razón para usar BCD sobre enteros regulares? ¿Y BCMath y GMP aceptan BCD así como enteros regulares [/ flotantes para BCMath]? – parent5446

+0

Ni BCMath ni GMP aceptan valores expresados ​​en BCD. La ventaja de BCD (en comparación con las cadenas con un dígito o carácter especial como punto o signo menos, etc.) es que BCD es más compacto: almacena 2-en lugar de 1- dígitos por byte, mientras permanece fácilmente asignable a la representación del número (un dígito en particular en el número corresponde exactamente a uno y solo un mordisco). Una desventaja de BCD es que no se puede representar en cadenas C (debido a la posible aparición de 2 ceros que se confunden con el terminador nulo. – mjv

+0

Normalmente, _you_ no quiere/necesita usar BCD, pero este formato a veces es un formato interno de las bibliotecas aritméticas de precisión arbitraria, y también se utiliza para aplicaciones especiales. – mjv

Cuestiones relacionadas