亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Java 的萊布尼茲公式

使用 Java 的萊布尼茲公式

慕絲7291255 2023-10-13 10:32:43
pi 的萊布尼茨公式是: pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9...我試圖用 Java 編寫這個,但遇到了一個問題,輸出總是4(這不是 pi 的值)。我將代碼放入 java 可視化工具中,問題似乎在于,當代碼落入 else 語句中時,它不會從 pi 中減去(1 分母),這使得 prevPi 值和 pi 值相同,即導致 do/while 循環結束。有誰知道我該如何解決這個問題?我的代碼:public static float piCalculatorLeibniz() {        float pi = 0;        int denominator = 1;        float prevPi = 0;        boolean keepGoing = true;        int i = 0;        while (keepGoing == true) {            prevPi = pi;            if (i % 2 == 0) {                pi += (1/denominator);            } else {                pi -= (1/denominator);            }            i++;            denominator += 2;            if (pi == prevPi) {                keepGoing = false;            }        }        pi *= 4;        return pi;    }
查看完整描述

3 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

你說得對。4實際上并不是Pi的值。


問題是denominator變量是int所以結果1/denomenator是。這使得您在一次迭代后退出循環,因為int/int0pi == prevPi


只需將denominator類型更改為雙精度(或浮點數),您就會得到正確的答案。


另外,你不需要寫while(keepGoing == true). 該變量keepGoing已經是一個布爾值,你可以簡單地寫while(keepGoing)


編輯:


我喜歡使用這段代碼,所以這里有一個稍微短一點的版本,由于使用了double. 它似乎也收斂得更快:


double pi = 0, denominator = 1, prevPi = 1;

while (pi != prevPi) {

    prevPi = pi;

    pi += (1 / denominator) - (1 / (denominator + 2));

    denominator += 4;

}

return pi * 4;


查看完整回答
反對 回復 2023-10-13
?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

問題是整數除法會產生整數,而不是浮點數或雙精度數。

1 / 3是 0。

為了避免這種情況,您可以改用浮點數作為分母,而不是整數。

float denominator = 1.0f;


查看完整回答
反對 回復 2023-10-13
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

讓你的所有操作數都是浮點類型。否則你的結果是一個整數。

請參閱Java 語言規范:

如果提升的類型是 float 或 double,則執行浮點運算。


另外,在大多數平臺上,您可以使用double而不會造成任何性能損失,但這是另一個主題。;-)


查看完整回答
反對 回復 2023-10-13
  • 3 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號