C ++的精确十进制数据类型?

PHP有一个十进制类型,它没有浮点数和双精度的“不准确性”,因此2.5 + 2.5 = 5而不是4.999999999978325或类似的东西。

所以我想知道C或C ++是否有这样的数据类型实现?

是:

C ++有任意精度库。
一个很好的例子是GNU Multiple Precision算术库 。

Boost.Multiprecision库有一个基于十进制的浮点模板类,名为cpp_dec_float ,您可以为其指定所需的任何精度。

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

总会有一些精确度。 在任何数字表示的任何计算机上,将始终存在可以准确表示的数字,以及不能表示的其他数字。

  • 计算机使用基本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) ),但总会有更多的数字仍无法准确表示。 有一个数学certificate就是这么说的。

所以 – 让我问你这个问题:你究竟需要什么? 也许精确计算基于十进制的数字,例如在一些货币计算中?

如果您正在寻找支持货币/货币的数据类型,请尝试以下操作: https : //github.com/vpiotr/decimal_for_cpp

(这是仅限标头的解决方案)

你要问的是反物理学。

phyton(和C ++)所做的是通过减少有效数字的位数,通过在打印时将结果四舍五入来切断不准确性:

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

只是使x以6位十进制数精度打印(而x本身超过12),并且将舍入为5,从而消除不精确度。

替代方案根本不使用浮点,并实现只进行整数“缩放”算术的数据类型: 25/10 + 25/10 = 50/10;

但请注意,这将减少每个整数类型表示的上限。 精度(和精确度)的增加将导致更快的溢出。

理性算术也是可能的(每个数字由“numarator”和“分母”表示),没有精确的分割损失,(事实上 - 除非确切,否则不会完成)但是再次,随着数字的增加值操作增长(数字越少“理性”,分子和分母越大),溢出风险越大。

换句话说,使用有限数量的比特(无论多么有条理)这一事实总是会导致你必须在大数字侧的小数据上支付损失。

我认为你在谈论PHP中的二进制计算器。 不,C运行时或STL中没有一个。 但如果你这么倾向,你可以写自己的。

这是使用Facebook的HipHop for PHP编译的BCMath的C ++版本: http ://fossies.org/dox/facebook-hiphop-php-cf9b612/dir_2abbe3fda61b755422f6c6bae0a5444a.html

作为一种更高级别的语言, PHP只会切断你所谓的“不准确”,但它确实存在。 在C / C ++中,您可以通过将结果转换为整数类型来实现类似的效果。