2011-03-09 12 views
9

Me preguntaba si algún compañero de SO podría recomendar una buena biblioteca de tipografía de tamaño fijo (128 bits o incluso 256 bits, posiblemente incluso con parámetros de plantilla).C++ Tipos de enteros de tamaño fijo de 128/256 bits

He echado un vistazo a GMP y compañía, les importa mucho, pero son un poco demasiado grandes para mis propósitos, me interesan las soluciones simples de solo encabezado en este punto. El rendimiento es importante y la arquitectura de destino será x86 y x86-64, también una licencia razonable (también conocida como GPL o LGPL).

+3

No he visto esas, pero no debería ser demasiado difícil escribirlas por su cuenta? (y como beneficio adicional, no tendrá problemas de licencia) – CygnusX1

+0

También observando esta pregunta: http://stackoverflow.com/questions/1188939/representing-128-bit-numeros-en-c –

Respuesta

0

Algunos tipos nativos de 128 bits están disponibles en ciertas plataformas, usted tiende a estar limitado por la arquitectura. Por ejemplo, __m128 está disponible para SSE2?

http://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx

También figuran como __int128 en este ABI:

http://www.x86-64.org/documentation/abi-0.99.pdf

Sin embargo la denominación preferida de uint128_t y uint256_t se puede encontrar en SHOGUN, una "caja de herramientas de gran aprendizaje automático escala con enfoque en especialmente Máquinas de Vector de Soporte (SVM) "

http://www.shogun-toolbox.org/doc/index.html

+0

'__m128i' es un vector empaquetado de elementos enteros. SSE/AVX admite el agregado/subido entero empaquetado con anchos de elemento de 8b a 64b, pero * no * 128b.Por supuesto, las operaciones booleanas sin carga entre bits (como AND/OR/XOR) Just Work. Para matemática de precisión arbitraria, SSE no proporciona un vector de acarreo, por lo que generalmente es más rápido usar el entero 'add' /' adc' que hacer algo con SSE. –

2

La biblioteca Xint se encuentra actualmente en review para formar parte de Boost. A pesar de que se trata más bien polémica y el resultado de la revisión no está claro todavía, la biblioteca cumple con algunos de sus requisitos:

  • cabecera única
  • licencia razonable

Uno de los puntos que se encuentran discutido durante la revisión es el rendimiento sin embargo. Si se acepta como una biblioteca oficial de Boost, espero que los problemas de rendimiento se aborden con prontitud.

Así que lo probaría: Code, Documentation.

+0

Acabo de leer su comentario a la respuesta de Seve-o donde usted aclara sus requisitos. Mi conclusión de la discusión sobre el LD es que lo que buscas no existe todavía. En mi opinión, Xint será aceptado y una versión 2 podría contener lo que buscas en términos de rendimiento. Ya tiene todo lo que necesita en términos de funcionalidad. – Sebastian

0

Dependiendo de sus requisitos, la clase STL bitset podría satisfacer sus necesidades. Responde a todos los operadores de manipulación de bit que hacen los tipos enteros (<<, | etc.), pero lamentablemente no a los operadores aritméticos como + o . Su tamaño se fija en tiempo de compilación a través de un parámetro de plantilla. Otra cosa desafortunada es que la API no proporciona ninguna forma de acceder a la representación binaria subyacente (por ejemplo, para transmitirla), lo que podría limitar seriamente su utilidad.

(sé que esto es una cuestión de edad, pero esta respuesta podría ayudar a los demás.)

3

La biblioteca tiene Boost tipos de datos como parte de multiprecision biblioteca, para los tipos que van desde 128 a 1024 bits.

#include <boost/multiprecision/cpp_int.hpp> 

using namespace boost::multiprecision; 

int128_t mySignedInt128 = -1; 
uint128_t myUnsignedInt128 = 2; 
int256_t mySignedInt256 = -3; 
uint256_t myUnsignedInt256 = 4; 
int512_t mySignedInt512 = -5; 
uint512_t myUnsignedInt512 = 6; 
int1024_t mySignedInt1024 = -7; 
uint1024_t myUnsignedInt1024 = 8; 
Cuestiones relacionadas