tipos - ¿Tipo de datos decimal exacto para C++?
tipos de datos en c pdf (7)
Al ser un lenguaje de nivel superior PHP
simplemente corta lo que usted llama "inexactitud", pero ciertamente está ahí. En C / C ++ puede lograr un efecto similar al convertir el resultado en un tipo de entero.
PHP tiene un tipo decimal, que no tiene la "imprecisión" de los flotantes y los dobles, por lo que 2.5 + 2.5 = 5 y no 4.999999999978325 o algo así.
Entonces, me pregunto si existe una implementación de tipo de datos para C o C ++.
La biblioteca Boost.Multiprecision tiene una clase de plantilla de coma flotante basada en decimales llamada cpp_dec_float
, para la que puede especificar la precisión que desee.
#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_dec_float.hpp>
int main()
{
namespace mp = boost::multiprecision;
// here I''m using a predefined type that stores 100 digits,
// but you can create custom types very easily with any level
// of precision you want.
typedef mp::cpp_dec_float_100 decimal;
decimal tiny("0.0000000000000000000000000000000000000000000001");
decimal huge("100000000000000000000000000000000000000000000000");
decimal a = tiny;
while (a != huge)
{
std::cout.precision(100);
std::cout << std::fixed << a << ''/n'';
a *= 10;
}
}
Sí:
Hay bibliotecas de precisión arbitraria para C ++.
Un buen ejemplo es la biblioteca aritmética de precisión múltiple de GNU .
Siempre habrá algo de precisión. En cualquier computadora en cualquier representación numérica siempre habrá números que se pueden representar con precisión, y otros números que no pueden.
Las computadoras usan un sistema base 2. Números como 0.5 (2 ^ -1), 0.125 (2 ^ -3), 0.325 (2 ^ -2 + 2 ^ -3) se representarán con precisión (0.1, 0.001, 0.011 para los casos anteriores).
En un sistema base 3 esos números no pueden representarse con precisión (la mitad sería 0.111111 ...), pero otros números pueden ser precisos (por ejemplo, 2/3 sería 0.2)
Incluso en el sistema humano base 10 hay números que no se pueden representar con precisión, por ejemplo, 1/3.
Puede usar la representación de números racionales y todo lo anterior será preciso (1/2, 1/3, 3/8, etc.) pero siempre habrá algunos números irracionales también. También está prácticamente limitado por los tamaños de los enteros de esta representación.
Para cada número no representable puede extender la representación para incluirla explícitamente. (por ejemplo, compare números racionales y una representación
a/b + c/d*sqrt(2)
), pero siempre habrá más números que aún no se pueden representar con precisión. Hay una prueba matemática que lo dice.
Entonces, déjame preguntarte esto: ¿qué necesitas exactamente? ¿Tal vez un cálculo preciso en números basados en decimales, por ejemplo, en algún cálculo monetario?
Supongo que estás hablando de la Calculadora Binaria en PHP. No, no hay uno en C runtime o STL. Pero puedes escribir el tuyo si así lo deseas.
Aquí hay una versión en C ++ de BCMath compilada usando el HipHop de Facebook para PHP: http://fossies.org/dox/facebook-hiphop-php-cf9b612/dir_2abbe3fda61b755422f6c6bae0a5444a.html
Lo que estás preguntando es anti-física.
Lo que phyton (y C ++ también) hacen es cortar la imprecisión al redondear el resultado en el momento de imprimirlo, reduciendo el número de dígitos significativos:
double x = 2.5;
x += 2.5;
std::cout << x << std::endl;
simplemente hace que x se imprima con una precisión de 6 dígitos decimales (mientras que x mismo tiene más de 12), y se redondeará como 5, eliminando la imprecisión.
Las alternativas no utilizan ningún punto flotante e implementan tipos de datos que solo hacen una aritmética "escalada" entera: 25/10 + 25/10 = 50/10;
Sin embargo, tenga en cuenta que esto reducirá el límite superior representado por cada tipo de entero. La ganancia en precisión (y exactitud) dará como resultado un alcance más rápido para desbordarse.
La aritmética racional también es posible (cada número está representado por un "numarator" y un "denominador"), sin pérdida de precisión contra divisiones (que, de hecho, no se realizan a menos que sea exacto) pero de nuevo, con valores crecientes como el número de operación crece (cuanto menos "racional" es el número, mayor es el numerador y el denominador) con mayor riesgo de desbordamiento.
En otras palabras, el hecho de que se use un número finito de bits (sin importar cuán organizado esté) siempre dará como resultado una pérdida que tendrá que pagar del lado de los pequeños al lado de los grandes números.
Si está buscando el tipo de datos que admite dinero / moneda, intente esto: https://github.com/vpiotr/decimal_for_cpp
(es una solución solo de encabezado)