如果你評價
(Math.PI).ToString("G51")
結果是
"3,141592653589793115997963468544185161590576171875"
Math.Pi根據 a 的精度,精確到小數點后 15 位是正確的double。“G17”用于往返,所以我希望ToString在“G17”之后停止,但它繼續產生直到“G51”的數字。
Q由于小數點后 15 位的數字超出了尾數 53 位提供的精度,那么剩余的數字如何計算?
uj5u.com熱心網友回復:
double 有一個 53 位尾數,對應于 15 位小數
double 有一個 53 位尾數,對應于大約15 位小數。
Math.Pi 在二進制中被截斷為 53 位,不完全等于
3.1415926535897
但它也不完全等于
3.14159265358979
, ETC。
就像 1/3 不完全是 0.3 或 0.33 等等。
如果你繼續小數擴展足夠長的時間,它最終會終止或開始重復,因為 Math.PI,不像 π 是一個有理數。
您可以使用BigRational型別進行驗證
using System.Numerics;
var r = new BigRational(Math.PI);
BigRational dem;
BigRational.NumDen(r, out dem);
var num = r * dem;
Console.WriteLine(num);
Console.WriteLine("-----------------");
Console.WriteLine(dem);
它是
884279719003555
---------------
281474976710656
并且由于分母是 2 的冪(它必須是因為 Math.PI 具有二進制尾數,因此以 2 為基數的終止表示)。因此它也有一個以 10 為底的終止表示,這正是由 給出的(Math.PI).ToString("G51"):
3.141592653589793115997963468544185161590576171875
作為
Console.WriteLine(r == BigRational.Parse("3.141592653589793115997963468544185161590576171875"));
輸出
True
uj5u.com熱心網友回復:
該.ToString("G51")方法使用“學校數學”。首先它取整數部分,然后乘以Remainder10,使用該計算的整數部分并將該Remainder部分乘以 10。
只要有余數和51小數位數,它將繼續這樣做。
由于double有一個指數,它將保持有大約 18 個十進制數字的余數,這會產生ToString方法中的下一個數字。
但是,如您所見,該Remainder部分并不準確,而只是數學函式的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/528405.html
標籤:C#数学浮点圆周率
上一篇:計算已平移和縮小的元素的位置
下一篇:我該如何解決這個簡單的數學查詢?
