浮点精度设置如何工作
How Floating Point precision setting works
我已经看到了有关如何为浮点数设置精度以及我们在下面做的任何事情的许多答案:
:double RoundDouble(double doValue,int nPrecision)
{
return (floor((doValue*pow(10,nPrecision)+0.5))/pow(10,nPrecision));
}
我不明白将正确设置的精度设置到几乎相等的数字中如何乘以乘以?任何人都可以详细解释
这只是在使用全数字舍入来实现我们在学校学习的所有技巧,以在小数点下切下来:在十进制之后拿起第一n位数字,向上或向下最正确的一个。
如果您在将12.3456到2个小数点舍入到2个小数位置中,那么您自然希望结果为12.35,因为" 4"是两位数的最正确的,并被随后的" 5"舍入围。
现在,要使用数学来实现这一目标,我们利用floor
来实现舍入(实际上您可以使用std::round
)。但这将使我们达到整个数字,我们将失去所有分数。
为了避免这种情况,我们首先乘以100,将所有有趣的部分移动到整个数字领域:
1234.56
如果您使用std::floor(x+0.5)
或std::round(x)
将此数字围成最接近的整体值,则获得:
1235.0
最后,将其除以100,使您的数字被舍入(是的,请记住我们将其舍入)到两个小数点:
12.35
希望您现在看到呼叫pow
的情况。通过将10提高到nPrecision
的功率,我们将获得一个缩放因子,在使用此技巧时,将在四舍五入后提供许多小数点。在这种情况下,我们想要2,而pow(10,2)
为100。
我自由清理您的功能以获得可读性:
double RoundDouble(double doValue, int nPrecision)
{
double scale_factor = pow(10.0, static_cast<double>(nPrecision));
return std::round(doValue * scale_factor) / scale_factor;
}
我尚未实现上面的实现,但是如果我们使用某些示例输入进行调试,那么下面的事情就会发生:
// say we have 5.89162 and we want it to 2 decimal places 5.89 so
RoundDouble(5.89162,2)
{
return (floor(5.89162*pow(10,2)+0.5))/pow(10,2);
/* which will look like
floor((5.89162x100+0.5)/100)
floor(589.662/100)
floor(5.89662)
and floor function will bound it to 5 it means the output will be 5 instead of 5.89*/
}
让我们逐步做。
-
x = doValue * pow(10, nPrecision)
-nPrecision
数字移至整体部分,其他位置保持在分形部分; -
y = floor(x + 0.5)
- 圆形到整体零件(如果x
是非负); -
z = y / pow(10, nPrecision)
- 移动nPrecision
数字回到分形部分。
它没有。浮点没有十进制位置。它有二进制位置,它们与十进制位置无关。它所做的只是提供近似值。
有关证明,请参见此处。
如果您要准确地想要十进制位置,则必须使用十进制radix。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个