如何以一定的精度存储数字?

时间:2015-05-09 19:48:03

标签: python c++ precision

我想要做的是计算一个数字 N 的平方根,而不是我们必须用 P 正确的十进制值存储这个平方根。例如

  Lets,N=2 and P=100

  //I want to store square root till P correct decimal values 
  like storing 
  1.41421356237309504880...till 100 values

编辑 - 最初我问过具体的c ++问题,但正如 vsoftco 所说的那样,没有boost,c ++几乎不可能做到这一点。所以我也标记了python并没有删除c ++标签,希望在C ++中得到正确的答案

2 个答案:

答案 0 :(得分:1)

C ++使用floating-point类型(例如floatdouble等)来存储浮点值并执行浮点运算。这些类型的大小(直接影响它们的精度)是实现定义的(通常你不会获得超过128位的精度)。此外,精确度是一个相对术语:当您的数字增长时,您的精确度越来越低。

所以,回答你的问题:使用标准C ++类型存储任意精度的数字是不可能的。您需要使用多精度库,例如Boost.Multiprecision

使用Boost.Multiprecison的示例代码:

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

int main()
{
   using namespace boost::multiprecision;
   typedef number<cpp_dec_float<100> > cpp_dec_float_100; // 100 decimal places

   cpp_dec_float_100 N = 2;
   cpp_dec_float_100 result = sqrt(N); // calls boost::multiprecision::sqrt
   std::cout << result.str() << std::endl; // displays the result as a string
}

如果您使用Python,则可以使用decimal模块:

from decimal import *

getcontext().prec = 100
result = Decimal.sqrt(Decimal(2))
print("Decimal.sqrt(2): {0}".format(result))

答案 1 :(得分:0)

嗯,有一个建议的c ++扩展,它定义了http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2849.pdf中描述的decimal类型系列。在现代gcc版本中有一些支持它,但它仍然没有满,即使在4.9.2

也许这对你来说是可行的。