2016-07-09 68 views
0

我正在用C++寫一個包含非常小的浮點數的程序。所以,我用double來表示數字。但是隨着浮點數在一個循環中相乘,它會導致最終產品爲0.但是我需要顯示實際的浮點數。我如何處理這些數字?如何在C++中處理非常小的數字?

class myclass 
{ 
private : 
    double value; 
} 

double calculate(count) 
{ 
    double key=this->value; 
    double prev_level=pow(2,level-1); 
    if(key-prev_level >=0) 
     key=key-prev_level; 

    int index= (2* key) + table[row_num][pos]; 
    double num1=array_l1[index]; // array_l1 and array_l2 are of type double 
    double num2=array_l2[index]; 

    std::pair<double,double> p = list[key].at(row_num); 
    double data=p.first; 
    prod1=num1 *data; 

    data=p.second; 
    prod2=num2 * data; 

    return prod1+prod2; 
} 

void compute() 
{ 

    double prod = 1; 
    for (int i = 0; i < count; i++) 
    { 
     myclass c1(count); 
     myclass c2(count+1); 
     double value= c1.calculate * c2.calculate(); 

    } 
} 

我不能夠包含所有的代碼,因爲它的大小,但我希望這個函數能解釋我面臨的問題。隨着count的值增加,value的值減小。因此,對於較大的值count,我得到一個0.

如何顯示value的實際值?

+1

'num'什麼也不做。嘗試使用科學計數法打印您的號碼 –

+1

[處理小數字和準確性]可能的重複(http://stackoverflow.com/questions/4799439/dealing-with-small-numbers-and-accuracy) –

+0

什麼是'some_function( )'?你爲什麼不使用'num'?請發佈整個事情。 「由於尺寸大小,我無法編寫完整的代碼」 - 不用擔心,我們可以處理它,就像可以獲得滾動條的文本框一樣。 –

回答

2

首先檢查您正在使用的輸出格式,允許科學計數法,不只是小數點後固定位數。

如果仍然導致零輸出,請考慮求和對數,而不要直接乘以數字。

如果,例如,目的是要比較產品的比例,就可以完成計算的對數,而沒有做冪返回到非對數的世界。

如果您只需要顯示結果,請選擇一個較大的常量。在執行冪運算之前,將常數的對數加到總和上,並在顯示中包含常數。

3

浮點類型使用固定大小的表示形式。這有兩個直接的含義:

  1. 一般來說,數值不能準確表示,而是使用四捨五入的值代替。
  2. 值的範圍是有限的。

如果您需要更精確或更廣泛的你需要一個不同的表示。你可能想看看What Every Computer Scientist Should Know About Floating-Point Arithmetic

+1

還有http://floating-point-gui.de/ –