2013-06-05 134 views
0

正如标题所述,我想将一个多位双精度分成多个部分,每个部分包含4个数字。将双分割成多个部分

我已经围绕了整数的整数,所以没有小数部分,剩下的是真正的长整数,远远超过了最大的长整数。

我需要整数部分分成若干4位部分,它与整数相当简单,像这样的while语句会做:

unsigned long long int IntegerWithSeveralParts; 
unsigned short int i = 0; 
unsigned int Parts[10]; 
while (IntegerWithSeveralParts) 
{ 
    Parts[i] = IntegerWithSeveralParts % 10000; 
    IntegerWithSeveralParts /= 10000; 
    ++ i; 
} 

是的,我知道的部分是按相反的顺序,但一个向量可以解决这个问题。问题是,我不能在浮动和双打上执行模块化,这对我来说是非常重要的。我可以将它们转换为字符串,并从中进行分割,但这非常耗时,因为这将包括使用流。

还有吗?

回答

2

fmod()该系列函数从<cmath>提供的x/y其中xy的浮点其余是两个函数的自变量。

+0

好的,我明白了! –

2

您可以随时将小数部分“提升”为一个整数乘以10000然后调制10000.这将会取前四位小数,并将它们作为int。重复执行此操作可获得更多4位数块。

+0

我知道,但我想知道如何修改浮动点值。但是正如@JonathanLeffler所说的那样,我需要的功能是在cmath中。 –

2

您可以使用fmod作浮点模数运算。但更简单的解决方案是使用stringstream将浮点数转换为字符串,然后将字符串拆分为长度最多为4的块。

+0

为什么?我认为流操作非常昂贵,然后'stringstream'转换为'string','string'转换为'int'。这看起来确实非常昂贵。 –

+0

那么实际成本取决于应用程序。确定这可能是昂贵的整数,但对于浮点数,我不太确定。你的应用性能是否敏感?如果它的一个正常的应用程序,并且这个功能不会被调用数千或数百万次,那么为什么不直接用解决方案 – dchhetri

+0

来采取。不管怎么说,还是要谢谢你。 –

0

当您将浮点值的二进制表示转换为十进制表示形式(通常通过转换为文本以显示它)时,通常最终会生成一系列无限制的十进制数字。当您设置输出流的精度时,您告诉运行时库限制它显示的数位数和四舍五入的尾数。你在这里要求的基本上是一样的,但是数字的排列方式与输出流不同。最简单的方法是使用输出流来生成所需的许多数字,然后根据需要重新排列它们:

std::string result; 
std::ostring_stream out; 
out << std::fixed << std::precision(12) << result; 
// now fiddle with result however you'd like