2016-12-22 134 views
-1

我想開發一個C++程序來將一個數字(比如2.45784e-05)乘以28224次。乘法之後,我必須在輸出上執行另一個任務。爲了自身繁衍的數量,我寫了一個C++程序如下:如何在C++中將一個非常小的數乘以100倍以上?

#include<iostream> 
    using namespace std; 
    int main() { 
     long double x = 2.45784e-05, y = 1; 
     cout << "Before multiplication, x= " << x << endl; 
     for (int i = 0; i < 28224; i++) { 
      y = y * x; 
      cout <<i+1<<". "<< "y=" << y << endl; 
     } 

     return 0; 
    } 

但是,程序給出準確的輸出高達1075倍。之後,它輸出0。結果如下:

Before multiplication, x= 2.45784e-05 
1. y=2.45784e-05 
2. y=6.04098e-10 
3. y=1.48478e-14 
4. y=3.64934e-19 
. 
. 
. 
1073. y=1.15885e-4946 
1074. y=3.6452e-4951 
1075. y=0 
1076. y=0 
. 
. 
. 
28223. y=0 

我的朋友們建議我在每次乘以一個常數後乘以x。但我不明白如何將常數與它相乘。請給我一個解決方案來獲得輸出。

+0

您必須編寫一個處理任意精確數字的類 –

+2

並提示:有* preview *功能。您希望我們花時間爲您提供幫助,因此請花費30多秒的時間來正確格式化/縮進所有源代碼! – GhostCat

+1

然後,你的實際問題是類型,如int,long,double ...有一個**範圍**在哪一天的工作。你想花一些時間看看第一個背後的數學問題;澄清你的想法爲自己... – GhostCat

回答

1

每次你將自己的號碼乘以,它增加了保留所需的數字的數量。說實話,即使從這1075個,我認爲大部分是正確的,或者更少,其他人將會聚合到可以表示爲雙倍的附近數字。爲了做到這一點,你需要使用一些第三方庫和任意認真的數學。看看這裏的列表:

https://en.wikipedia.org/wiki/List_of_arbitrary-precision_arithmetic_software

你的朋友要你做不會有太大的幫助是什麼:常數倍將移動小數點,但不會減少的,以評估所需要的數字量。

編輯@ Borgleader的解決方案看起來相當不錯(升壓:多倍)。

+0

謝謝。安裝「Boost Multiprecision Library」後,我可以得到準確的結果。 –

0

給定x = 2.45784e-05和y = 28224並且你想要x^y(功率)。 找到s(比例)使得z = x * s,那麼你的答案是(z/s)^ y = z^y/s^y。 如果s是10^6,那麼你可以計算s^y爲10 ^(6 * y)。

我期望z^y仍然會溢出,但它會發生在更高的指數 然後你可以改進這個想法。提示:嘗試使用s作爲2的冪。

1

這裏的問題實際上不是精度(或者本身,它只是問題的一部分,但不是本質的一部分)。

這裏的主要問題是範圍,所得到的數目太小,在double(結果指數是走出去的double表示的最小指數的範圍)來表示。因此,對於計算機而言,其實際爲0.

將值乘以某個數字以使其變大(即「縮放」)的想法可以起作用,然後您需要補償結果指數。

另請注意,如果您想多次乘以相同數字/多次,則可以使用pow(num, N)來代替,如果N很大,則速度會更快。