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 ++中,您可以通过将结果转换为整数类型来实现类似的效果。