簡體   English   中英

C#中的雙重比較精度損失,添加減去雙精度時發生精度損失

[英]Double comparison precision loss in C#, accuracy loss happening when adding subtracting doubles

剛開始學習C#。 我計划將它用於繁重的數學模擬,包括數值求解。 問題是我在添加和減去double時以及比較時都會出現精度損失。 代碼及其返回的內容(在評論中)如下:

namespace ex3
{
    class Program
    {
        static void Main(string[] args)
        {

            double x = 1e-20, foo = 4.0;

            Console.WriteLine((x + foo)); // prints 4
            Console.WriteLine((x - foo)); // prints -4
            Console.WriteLine((x + foo)==foo); // prints True BUT THIS IS FALSE!!!
        }
    }
}

非常感謝任何幫助和澄清!

令我困惑的是(x + foo)==foo返回True

看一下double MSDN參考: https//msdn.microsoft.com/en-AU/library/678hzkk9.aspx

它聲明double的精度為15到16位。

但就數字而言, 1e-204.0之間的差異是20位數。 嘗試將1e-20加到或減去4.0的單純行為僅僅意味着1e-20丟失,因為它不能適應精度的15到16位數。

因此,就double而言, 4.0 + 1e-20 == 4.04.0 - 1e-20 == 4.0

除了Enigmativity的回答:

要使其工作,您需要更高的精度,以及精度為28到29位且基數為10的decimal

decimal x = 1e-20m, foo = 4.0m;
Console.WriteLine((x + foo)); // prints 4.00000000000000000001
Console.WriteLine((x - foo)); // prints -3.99999999999999999999 
Console.WriteLine((x + foo) == foo); // prints false.

但要注意十進制具有更高的精度但具有更低的范圍是正確的 在這里查看更多關於十進制

您正在尋找的可能是十進制結構( https://msdn.microsoft.com/en-us/library/system.decimal.aspx )。 Doubles無法正確表示您正在尋找的精度值( C#加倍到十進制精度損失 )。 相反,嘗試使用Decimal類,如下所示:

decimal x = 1e-20M, foo = 4.0M;

        Console.WriteLine(Decimal.Add(x, foo)); //prints 4,0000000000000000001
        Console.WriteLine(Decimal.Add(x, -foo)); //prints -3,9999999999999999999
        Console.WriteLine(Decimal.Add(x, foo) == foo); // prints false

這不是C#的問題,而是您的計算機。 這並不是很復雜或難以理解,但這是一個很長的閱讀。 如果您想深入了解計算機的工作原理,請閱讀本文

一個優秀的TLDR網站,imho是一個比上述文章更好的介紹是這一個:

http://floating-point-gui.de/


我將為您提供一個非常簡短的解釋,但是您應該至少閱讀該網站,以避免將來出現問題,因為您的應用領域需要深入了解這些知識。

會發生以下情況:您有1e-20,這個數字小於1.11e-16。 另一個數字,在您的計算機上被稱為機器epsilon以獲得雙精度(最有可能)。 如果您將一個等於或大於1的數字添加到小於機器epsilon的數字,它將四舍五入,返回到大數字。 這是由IEEE 754表示。 這意味着在添加發生后,結果是“正確”(就好像你有無限精度),結果以有限/有限精度的格式存儲,即4.00 .... 001到4,因為四舍五入的誤差小於1.11e-16,因此被認為是可接受的。

暫無
暫無

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

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