簡體   English   中英

C#雙精度問題

[英]C# double precision problem

想象一下a - b <c (a,b,c是C#的雙打)。 是否保證<b + c

謝謝!

編輯
假設與以下示例不同,不會出現算術溢出:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

想象一下, Math.Abs​​(a)<1.0 && Math.Abs​​(b)<1.0 && Math.Abs​​(c)<1.0

不。假設a = c,非常大的數字,b是非常小的數字。 有可能a - b的表示小於a ,但a + b非常接近a (並且更大),它仍然最終可以最精確地表示為a

這是一個例子:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

編輯:

這是另一個與您編輯過的問題相符的示例:

double a = 1.0;
double b = 1.0 / (1L << 53);
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

換句話說,當我們從1中減去一個非常小的數字時,我們得到的結果小於1.當我們將相同的數字加到1時,由於雙精度的限制,我們只得到1。

不總是:

        double a = double.MaxValue;
        double b = double.MaxValue;
        double c = 0.1;
        Console.WriteLine(a - b < c); // True
        Console.WriteLine(a < b + c); // False

這個鏈接講的是浮點算術屬性,可能非常有趣:

浮點落差

特別是,搜索關系屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM