2017-08-19 42 views
0

我已經給了一個日誌值Y,我要計算Y的抗日誌即找到摩多值

ans = (Math.pow(10,Y))%mod 

其中mod = 1e9+7和Y的抗日誌將永遠是整數,即
Y是計算爲按照Y= log(a) a is very large integer of range 10^100000

因此,對於給定的Y我需要計算ans?考慮到mod操作,該怎麼做。

我的做法

double D = Y -(int)Y 
long Pow = (long)Y 

    for(int i=1;i<=Pow;i++) ans = (ans*10)%mod; 

    ans = (ans*Math.pow(10,D))%mod 

但它不是正確的有人可以在這裏建議是有效的方法? BigDecimal在那裏很有用?
例如:

Y = 16.222122660468525 

使用簡單的方法,並四捨五入即Math.log(10,Y)給我1667718169966651但使用循環它給我16677181699666510。我現在不使用mod,只是解釋有錯誤。

這裏Y小,所以直接的方法工作,我們可以輕鬆地採取mod。如果Y的範圍是10000,它將不會工作並溢出,所以我們必須使用mod。

+0

爲了確認,這裏的日誌是'log(a)'或'log10(a)'?爲什麼'Math.pow(Math.E,(Math.log(a)))'找不到反對數? – nullpointer

+0

@nullpointer它的基數爲10 – Regression

+0

然後'Math.pow(10,(Math.log(a)))''有什麼問題? – nullpointer

回答

0

我想這應該工作

double D = Y -(int)Y 
long Pow = (long)Y 

for(int i=1;i<=Pow;i++) ans = (ans*10)%mod; 

ans = (ans*Math.pow(10,D)) 
ans = Math.round(ans) 
ans%=mod 
+0

當'Y'很大時,我認爲它不準確 – Regression

0

有一個在這裏你的判斷錯誤 - 循環方法沒有過錯

您示例中的a的值有17個整數數字。從this stackoverflow postdouble具有約16個有效數字的精度。因此,循環和直接計算事實上受缺乏精確度的限制。

(?只是爲了確認,使用high precision calculatora16677181699666650.8689546562984070600381634077...因此,不論你的價值觀是不正確的 - 除非你錯誤地複製它們)

因此你的循環方法是沒有問題的;你只需要一個更精確的方法來做最後一步(計算pow(10, frac(Y)))。


作爲一個側面說明,有做的環部分的更有效的方法 - this post有更多的細節。