【发布时间】:2017-02-20 17:48:13
【问题描述】:
我已经阅读了与“四舍五入到 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(0.253e+5,2digits)==0.25e+5(相对)与round(0.253e+5, 100units)==0.253e+5)? -
@AdrianColomitchi 我说的更多是
0.0236舍入到 3 位返回0.024如果这就是你在说的话? -
“我实际上是在使用 Boost 多精度来实现任意精度的浮点数”——你必须比这更具体。
-
你有它:
round(x, precision_unit)=trunc(x/precision_unit+0.5)*precision_unit;- 我的答案中的代码 -
您的
0.5671432...不是任意长度的浮点数。它是值的文本表示,编译器会将其转换为浮点值。我所知道的每个系统上的浮点值不支持 192 位精度,更不用说 1000 位(通常,double可以容纳大约 16 位)。一旦超出了浮点值的精度,您显示的任何数字本质上都是无稽之谈。因此,无论您想对所有这些数字做什么,都必须对文本表示进行处理,而不是浮点类型。
标签: c++ rounding arbitrary-precision