我正在编写一个模板类,旨在与任何浮点类型一起使用。对于某些方法,我需要将一个数字分成整数部分和小数部分。使用原始浮点类型,我可以只转换为整数来截断小数部分,但这不适用于大数字类。理想情况下,我的班级在计算中只使用四种基本算术运算(加法、减法、乘法、除法)。
下面的方法是我想出的解决方案。它所做的只是减去 10 的幂,直到原始数字小于 1。它运行良好,但似乎是一种蛮力方法。有没有更有效的方法来做到这一点?
template< typename T >
class Math
{
public:
static T modf( T const & x, T & intpart )
{
T sub = 1;
T ret = x;
while( x >= sub )
{
sub *= 10;
}
sub /= 10;
while( sub >= 1 )
{
while( ret >= sub )
{
ret -= sub;
}
sub /= 10;
}//while [sub] > 0
intpart = x - ret;
return ret;
}
}
请注意,为简洁起见,我删除了标志管理代码。