精确十进制数据类型C ++?(Exact decimal datatype for C++?)

2019-07-21 07:05发布

PHP有一个小数类型,它不具有浮点型和双的“不准确”,使2.5 + 2.5 = 5,而不是4.999999999978325或类似的东西。

所以我想如果有这样的C或C ++数据类型的实现?

Answer 1:

是:

存在用于C ++任意精度库。
一个很好的例子是在GNU多精度运算库 。



Answer 2:

该Boost.Multiprecision库有一个叫做基于十进制浮点模板类cpp_dec_float ,以便您可以指定任何你想要的精确度。

#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;
    }    
}


Answer 3:

如果你正在寻找的数据类型支持货币/货币,然后试试这个: https://github.com/vpiotr/decimal_for_cpp

(这是仅头的溶液)



Answer 4:

将有总有一些精度。 在任意数量的表示的任何计算机会有总是能精确表示数字和其他数字哪些不可以。

  • 计算机使用基座2系统。 号码如0.5(2 ^ -1),0.125(2 ^ -3),0.325(2 ^ -2 + 2 ^ -3)将被精确地表示(0.1,0.001,0.011对于上述情况)。

  • 在碱3系统那些数字不能被精确地表示(半将是0.111111 ...),但其它数目可以是准确的(例如2/3将是0.2)

  • 即使在人类基座10系统有不能准确地表示,例如1/3的数字。

  • 您可以使用合理的数字表示,所有上述将是准确的(1/2,1/3,3/8等),但会有那么一些无理数得。 你也几乎被这表象的整数的大小的限制。

  • 对于每一个非表示数可以延长表示明确地包含它。 (例如比较有理数和一个表示a/b + c/d*sqrt(2)但始终存在一些更多的数字,其仍然不能准确地表示。 有一个数学证明是这么说的。

所以 - 让我来问你:你到底需要什么? 也许在小数为主的数字精确的计算,例如在一些货币计算?



Answer 5:

什么你问是抗物理。

什么植酮(和C ++一样)做的是四舍五入的结果在当时打印出来,通过减少显著的位数切断误差:

double x = 2.5;
x += 2.5;
std::cout << x << std::endl;

只是使要被印刷有6小数位精度(而X本身具有超过12)的x,和将被舍入为5,切掉的不精确性。

替代方案不使用浮点所有,并执行那些只是整数“缩放”数据类型的算术: 25/10 + 25/10 = 50/10;

但是请注意,这将降低由每个整数类型所表示的上限。 在精密(和准确性)的增益会导致更快的达到溢出。

合理的算法也有可能(每个数字由“numarator”和“分母”表示),与对部门没有精度损失,(即-in实况并不确切,除非做),但再一次,其值增加的数量运行长(少“理性”是多少,越大的分子和分母)与溢出的风险更大。

在其他字位数量有限的使用的事实(不管多么有组织的)总是会导致你不得不对小方支付对大数一侧的损失。



Answer 6:

我想你说的是在PHP的二进制计算器。 没有,没有一个在C运行时或STL。 但是,如果你愿意的话,你可以自己编写。

以下是编译使用Facebook的街舞为PHP bcmath时的C ++版本: http://fossies.org/dox/facebook-hiphop-php-cf9b612/dir_2abbe3fda61b755422f6c6bae0a5444a.html



Answer 7:

作为一个高级语言PHP只是切断了你所说的“不准确”,但它肯定是有。 在C / C ++,你可以通过铸造的结果为整型达到类似的效果。



文章来源: Exact decimal datatype for C++?