¿Hay un C ++ equivalente al BigDecimal de Java?

Estoy buscando una clase de C ++ que pueda hacer aritmética de coma flotante decimal. Mirando a través de http://speleotrove.com/decimal/ hay enlaces a todo tipo de clases que las personas escribieron y no mantuvieron. Explorar las cuestiones de decNumber ++ me llevó a algunos correos electrónicos que muestran que GCC eventualmente admitirá esta funcionalidad. (Formalmente conocido como ISO / IEC TR 24733)

Estoy buscando algo que pueda usar como reemplazo directo para flotante o doble, algo que otras personas están usando en sus propios proyectos. Con suerte fuente abierta.

¡Gracias!

EDIT: Debo señalar que estoy tratando de usar esto para representar los precios. Necesito decimales EXACTOS, no GRANDES decimales.

Existe una gran biblioteca llamada GMP (biblioteca de precisión múltiple GNU) que admite esto y también tiene enlaces C ++, aunque para ser honesto, la interfaz C ++ es un poco inestable y desactualizada.

Un ejemplo de la documentación, el siguiente crea un flotador llamado f con al menos 500 bits de precisión:

 mpf_class f(1.5, 500); 

Elige tu opción. Hay muchos por ahí. Por ejemplo, puede consultar la lista en Wikipedia .

Si necesita realizar operaciones con valores decimales ENORMES, le sugiero que use http://gmplib.org/ library. Lo he usado mucho con C y C ++.

La pregunta es un poco antigua, pero para otras personas que tienen la misma necesidad: Boost.multiprecision es probablemente lo que estás buscando.

http://www.boost.org/doc/libs/1_57_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

Es una biblioteca de precisión arbitraria que puede manejar decimales basados ​​en 10.

Use GMP y almacene todo como centavos. Si sabe que no va a pasar 2 ^ 32 centavos (42.949673 millones de dólares) utilice una int sin firmar de 32 bits (o utilice una int sin firmar de 64 bits) y manténgala simple.

Probablemente, “MAPM, una biblioteca portátil matemática de precisión arbitraria en C” es lo que está buscando. También incluye envoltorios C ++:

http://www.tc.umn.edu/~ringx004/mapm-main.html

Puede que sea demasiado tarde para esto, pero ¿funcionarían los decibeles de 128 bits? Estos han sido aceptados en C ++ y al menos gcc los tiene desde gcc-4.5 (estamos comenzando 4.9 ahora:

 #include  #include  using namespace std; int main() { { std::decimal::decimal32 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal32 = " << (dn==dn4) << " : " << decimal32_to_double(dn) << endl; } { std::decimal::decimal64 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal64 = " << (dn==dn4) << " : " << decimal64_to_double(dn) << endl; } { std::decimal::decimal128 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal128 = " << (dn==dn4) << " : " << decimal128_to_double(dn) << endl; } return 0; } 

Tenga en cuenta que hay decimal32 igual en tamaño para flotar, decimal64 igual en tamaño a más doble. Entonces decimal128 es bastante grande. De Wikipedia : Decimal128 admite 34 dígitos decimales de significado y un rango de exponente de -6143 a +6144, es decir, ± 0.000000000000000000000000000000000 × 10-6143 a ± 9.999999999999999999999999999999999 × 106144. (Equivalentemente, ± 0000000000000000000000000000000000 × 10-6176 a ± 9999999999999999999999999999999999 × 106111).

La biblioteca mpfr es punto flotante binario de precisión arbitraria, no precisión arbitraria decimal. Hay una diferencia.

Aquí hay una implementación de BCMath PHP a C ++. Hay dos versiones, una para Qt y la otra para usar solo STL.

Fuente: https://github.com/DesarrollosCuado/BCMath-for-Cpp

 BCMath::bcscale(4); //Num Decimals BCMath test("-5978"); test^=30; //Pow, only integers. Not work decimals. std::cout<<"Result BigDecimal 1: "< BCMath("2"))<=BCMath("2"))< BCMath("2"))<=BCMath("2"))< 

Resultado:

 Result BigDecimal 1: 198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113024 Result BigDecimal 2: 198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113022.7700 Result BigDecimal 3: 243546802723182111925946974022640799493834467494980379499586589209898957211224134482916796088524041355975600919018.0071 Result BigDecimal 4: -299562567349513997668914778047848183377416395018825866784491504728175717369805685413987659188884570867849989130392.1487 Result Super Precision 1: -5943534512345234542.7583001856941315459727023167204971158028306006248941790250554076921835 Result Super Precision 2: -5943534512345234549.0414854928737180228979890832795028841971693993751058209749445923078164 Result Super Precision 3: -18672164360341183116.9114783895073349180904753962992796943871920962352436079118338887287186 Result Super Precision 4: -1891885794154043400.2804849527556211973567525043250278948318788149660700494315139982452600 Other 1: 8023400.1075 Other 2: 1000008.0368 Compare 1: -1 Compare 2: 0 Compare 3: 1 Compare 4: true Compare 5: true Compare 6: false Compare 7: false Compare 8: false Compare 9: true Compare 10: false Compare 11: true Round 1: 123.0125 Round 2: -123.013 Round 3: 123.01 Round 4: 3.142 Int part 1: -0 Dec part 1: 123 Int part 2: 0 Dec part 2: 123 Int part 3: 123 Dec part 3: 0