[英]What's the benefit of accepting floating point inaccuracy in c#
為什么c#通過使用浮點來存儲數據來接受不准確?
“C#”不接受性能與准確性的權衡; 用戶做或不接受。
C#有三種浮點類型 - float,double和decimal - 因為這三種類型滿足了現實世界程序員的絕大多數需求。
float和double適用於“科學”計算,其中對三位或四位小數正確的答案總是足夠接近,因為這是原始測量所帶來的精度。 假設你將10.00除以3得到3.333333333333。 由於原始測量值可能精確到0.01,因此計算結果偏差小於0.0000000000004這一事實無關緊要。 在科學計算中,您不代表已知的准確數量。 如果原始測量值僅精確到小數點后第二位,則小數點后十五位的不精確度無關緊要 。
這當然不適用於財務計算。 財務計算的操作數通常精確到小數點后兩位並表示精確數量 。 十進制適用於“財務”計算,因為十進制運算結果是精確的,前提是所有輸入和輸出都可以精確地表示為小數(並且它們都在合理的范圍內)。 當然,小數仍然存在舍入誤差,但精確的運算正是您在進行財務計算時可能想要精確的運算。
使用它比其他方法有什么好處?
您應該說明您想要比較的其他方法。 在計算機上執行計算有很多不同的技術。
例如,Math.Pow(Math.Sqrt(2),2)在c#中並不精確。 有些編程語言可以精確計算它(例如,Mathematica)。
我們在這一點上要明確; Mathematica沒有完全“計算”根2; 這個數字是不合理的,因此無法在任何有限的存儲量中精確計算。 相反,mathematica所做的是它將數字表示為描述數字生成方式的對象。 如果你說“給我兩個平方根”,那么Mathematica本質上會分配一個對象,意思是“將平方根運算符應用於精確數字2”。 如果你然后對它進行說明,它就有一個特殊用途的邏輯,即“如果你把某些東西放在其他東西的平方根上,那么就給出原始值”。 Mathematica具有代表各種特殊數字的對象,如pi或e,以及關於這些數字的各種操作如何組合在一起的大量規則。
基本上,它是一個象征性的系統; 它操縱數字的方式與人們做鉛筆紙數學時的操作方式相同。 大多數計算機程序操縱數字,如計算器:立即執行計算並將其四舍五入。 如果這是不可接受的,那么你應該堅持使用符號系統。
我能想到的一個論點是,計算它確實比僅僅處理不准確性慢得多,但Mathematica和Matlab用於計算巨大的科學問題,所以我發現很難相信這些語言真的比c#慢得多。
雖然它們的速度並不慢,但浮點數的乘法在現代硬件上確實非常快。 這是符號計算引擎非常復雜 。 它編碼了所有基礎數學規則 ,並且有很多規則! C#不是一個專業級的符號計算引擎,它旨在成為一種通用的編程語言。
一句話:表現。 浮點算法通常在硬件上實現,並且比其他方法快許多個數量級。
你的MATLAB實例更是虛假。 MATLAB使用雙精度浮點運算,就像C#一樣。
為什么c#通過使用浮點來存儲數據來接受不准確?
通過這種方式,浮點支持可以映射到硬件方式支持浮動點,那就是-它是或多或少的采取浮點運算硬件,這比軟件解決方案快很多的優勢的唯一途徑。 缺點是硬件代表具有有限位數的浮點,這導致不准確(注意,不准確性是明確定義的)。
表示浮點值的其他方式需要軟件解決方案,它顯着更慢並且需要更多空間。 “任何人”都可以使用c#中提供的內容來實現,包括對可用硬件的本機浮點支持對於“任何人”來說都很難,如果語言/ CLR中尚未支持的話。
對於大多數編程問題,不准確性不是問題, float
(或double
)數據類型足夠好。 許多年前,沒有“浮點值”這樣的東西,軟件必須存儲兩個整數這樣的值。 性能是一個問題(沒有提到編程錯誤 - 和wtf場景 - 來自定制的浮點計算函數)。 因此,設計了一個慣例,並且在計算機配備FPU之后不久。
現在,何時使用FPU進行計算或使用其他數學圖書館/程序(如Mathematica)取決於問題。 例如,計算3d環境中的頂點會優先考慮性能而不是精度。 但會計軟件是不同的。 在這方面,兩個問題都不同; 一個會計軟件不需要每秒數百萬次計算復數:)( 編輯 :如果確實如此,一些非常昂貴的硬件也可能是等式的一部分!)
如果你知道你將要做Math.pow(Math.sqrt(2),2)那么你應該重新考慮存儲兩個值的方式(比如每次重新計算它們)。 這不是編程語言的問題,而是更多的概念問題。
C#和大多數其他語言(除了特定的語言,如Matlab)將浮點數存儲為固定大小的字段(6或8字節),這會導致不准確。
我不認為這是c#問題。 c#是一種通用語言,為您提供基本數據類型。 如果你對他們不滿意,你總是可以自由創造自己的。
此外,c#不是接受不准確的人。 程序員呢。 對於大量問題,不准確是可以接受的。 如果預期得到確切結果,則不應使用浮點數,但這是程序員不是語言設計者的決定。
一個原因是數字和數字格式是明確的和普遍的。 是的,存在舍入錯誤,但它們是恆定且可預測的。 嘗試為任何算法問題設置通用格式並非易事。
有一點的解釋這里的數學
短版本用於常規的日常浮點數學運算,硬件可以在已知的不准確度下快速完成。 因此,如果您的計算不依賴於更精確,那么快速進行。
如果確實需要精度,那么程序員必須將算法編寫為所需的精度。 哪個會慢一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.