簡體   English   中英

在c#中接受浮點不准確有什么好處?

[英]What's the benefit of accepting floating point inaccuracy in c#

最近 幾天我腦子里已經遇到了這個問題,我很難說出我的問題。 但是,我想我已經釘了我想知道的東西。

為什么c#通過使用浮點來存儲數據來接受不准確? 使用它比其他方法有什么好處?

例如, Math.Pow(Math.Sqrt(2),2)在c#中並不精確。 有些編程語言可以精確計算它(例如,Mathematica)。

我能想到的一個論點是,計算它確實比僅僅處理不准確性慢得多,但Mathematica和Matlab用於計算巨大的科學問題,所以我發現很難相信這些語言真的比c#慢得多。

那么為什么呢?

PS:我很抱歉用這些問題向你發送垃圾郵件,你們都非常樂於助人

為什么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.

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