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

dte*_*ech 18 c c++ precision types decimal

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

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

Ben*_*ley 21

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;
    }    
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 7

是:

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

  • @EmilioGaravaglia:重读后.你似乎混淆了确切的无限(精确)和任意(精确).图书馆的全部意义在于您从不会失去输入的精确度.使用的内部表示应该保持至少与输入一样精确的表示.任何会导致像"1/3"这样的表示丢失的操作都会被推迟,以便以后可以取消.有理数(如`pi`和`e`)不会转换为十进制表示(就像你手工做数学时一样). (4认同)
  • 重点是说"不是",然后用不同的措辞描述完全相同的概念?"不"代表什么? (3认同)
  • 请注意,这实际上不会"解决"一般问题:它会将其推迟到您可以选择的更深的精度级别.总比没有好,但是 - 不幸的是 - 只是超越一步,走向不可能的"无限精确".好的提示,无论如何! (2认同)
  • @EmilioGaravaglia:不一样.你暗示精度有限.那没有.它就像向更大的整数说一步.我们可以有你想要的整数(只要你有记忆). (2认同)
  • "尽可能大"<"无限".你总是不得不以某种方式回合.只有无限的机器才能进行无限精度计算.这不是一个观点,而是一个证明的定理.OP要求精确的小数3*(10/3)== 10.无论多长时间都没有这样的小数. (2认同)
  • @EmilioGaravaglia:不对.并且容易表现为虚假.您将1/3(三分之一)表示为两个整数(1和3).这就是这些库中的一些工作原理(不确定gmp是否这样做,但我怀疑).它精确到无限精度.所以每个数字都表示为一对(枚举数和分母).乘法/除法影响数字的适当部分.所以(3 + 1/3)*9 = 30.(确切地说). (2认同)
  • 这不是"无限精度",因为分母有一个上限.这只是一个更好的近似值.即使你以"理性形式"表示一个数字,给定一个比特大小,总有一些分数无法表示为该比特.对于基于"有限空间"的任何数字表示,这总是正确的.事实上10/3可以适合"一对,如果整体"不是一个示范 (2认同)
  • @EmilioGaravaglia:所以任何数学都是以你需要的精确度完成的.当然有限制计算机具有有限的内存,因此您可以将其全部用完(但在此之前很久就会崩溃).但实际上你有**精确**任意精度,因为你没有松动任何.哪个比无限更好,因为这是无意义的比较. (2认同)

小智 5

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

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