2013-06-05 65 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