繁体   English   中英

舍入为任意长度的舍入为n位数字

[英]Round arbitrary-length floats to n digits

我已经阅读了大多数与“舍入到n位数字”有关的SO问题。 我认为这个问题是分开的,因为它与任意长度的浮点数的舍入关系更大。

0.56714329040978387299996866221035554975381578718651250813513107922304579308668456669321944696175229455773495728285284421635951688

上面的数字是我正在使用的数字类型的示例。

我知道如何在C ++中四舍五入,这非常简单。 但是,我不明白如何将任意长的数字四舍五入为n位数字。

例如,我可能有一个长度为192位数字的数字,我需要四舍五入为84位数字,或者一个数字为1831位数字,我需要四舍五入为293位数字。 如何使用一个功能(或类似功能)完成此操作?

为了清晰起见,使用伪代码,但实际上我是对任意精度浮点而不是标准浮点使用Boost多精度cpp_dec_float

float round(float num, int digits){
    //returns num rounded to n digits
}

我遇到的另一个问题是,当尝试将很长的浮点数舍入为少量数字时。

例如,如果我有一个1000位数长的数字,并且想将其四舍五入为n位数,则必须执行floor(num * 10^1000)/10^1000) 这不起作用,因为10 ^ 1000非常大。 一个解决方案是用较小的指数多次进行乘法和除法。

[编辑-更好的解决方案]

进行舍入可以基于:

round(x, precision_unit)=trunc(x/precision_unit+0.5)*precision_unit;

就像是:

  using namespace boost::multiprecision;

  const uint lower_prec_digits=28;

  typedef number<cpp_dec_float<100>> higher_prec;
  typedef number<cpp_dec_float<lower_prec_digits>> lower_prec;

  const higher_prec eps_div=
      std::numeric_limits<
          number<cpp_dec_float<lower_prec_digits+1>>
      >::epsilon()
  ;

  higher_prec pi(
    "3.1415926535"
      "8979323846"
      "2643383279"
      "5028841971"
      "6939937510"
      "5820974944"
      "5923078164"
      "0628620899"
      "8628034825"
      "3421170679"
  );

  lower_prec round_pie=lower_prec(trunc(pi/eps_div+0.5)*eps_div);

  std::cout.precision(100);
  std::cout << round_pie << std::endl << pi << std::endl;

结果:

3.1415926535897932384626433833
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM