あらゆる浮動小数点型で動作するように設計されたテンプレートクラスを作成しています。いくつかの方法では、数値をその整数部分と小数部分に分割する必要があります。プリミティブ浮動小数点型では、整数にキャストして小数部分を切り捨てることができますが、これは大きな数のクラスでは機能しません。理想的には、私のクラスは、計算に4つの基本的な算術演算(加算、減算、乗算、除算)のみを使用します。
以下の方法は私が思いついた解決策です。元の数が1未満になるまで、10の累乗を引くだけです。これはうまく機能しますが、ブルートフォースアプローチのように見えます。これを行うためのより効率的な方法はありますか?
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;
}
}
簡潔にするために、サイン管理コードを削除したことに注意してください。