如何在C ++中编写良好的round_double函数?
|
我正在尝试编写良好的round_double函数,它将以指定的精度四舍五入:
1。
double round_double(double num, int prec)
{
for (int i = 0; i < abs(prec); ++i)
if(prec > 0)
num *= 10.0;
else
num /= 10.0;
double result = (long long)floor(num + 0.5);
for (int i = 0; i < abs(prec); ++i)
if(prec > 0)
result /= 10.0;
else
result *= 10.0;
return result;
}
2。
double round_double(double num, int prec)
{
double tmp = pow(10.0, prec);
double result = (long long)floor(num * tmp + 0.5);
result /= tmp;
return result;
}
此功能无法完成我想做的事,但我认为它们还不够好。因为从精度= 13-14开始,它们将返回不良结果。
我确定可以写出更好的double_round的原因是,仅以指定的精度(例如18)通过cout
打印数字,比我的函数结果打印的结果更好。
例如这部分代码:
int prec = 18;
double num = 10.123456789987654321;
cout << setiosflags(ios::showpoint | ios::fixed)
<< setprecision(prec) << \"round_double(\" << num << \", \"
<< prec << \") = \" << round_double(num, prec) << endl;
第一个first5ѭ打印round_double(10.123456789987655000, 18) = -9.223372036854776500
,第二个second4打印。
如何在C ++中编写良好的round_double函数?还是已经存在?
没有找到相关结果
已邀请:
3 个回复
旅牢斯讲
就足够了。
请注意,迈克也是正确的,您只能在两倍范围内代表有限的范围。如果您需要干净的十进制响应,则不是很好。但是
是导致您数字古怪的原因。
箩冀娥
更高精度的
类型。 编辑:对不起,我没有注意到您得到的是完全不正确的结果。另一个答案是,这是由于转换为“ 7”溢出所致。
铰齐插
输出...