為什麼在專案中要盡量避免使用浮點數,不使用浮點數,那該如何計算浮點數?

時間 2021-05-30 17:08:23

1樓:Trueman

搜尋高精度演算法。

浮點數在數值分析中都是乙個困難的問題。因為格式很僵化,總是自動捨去尾數,不知道後面變成什麼,不可控的東西太多。尾數一旦扔掉是撿不回來的。

2樓:

浮點數的缺點是不是絕對的精準,優點是計算效率高(大部分cpu對浮點數都有專門單元處理的,比如x86的fpu)比較省儲存空間。

要求絕對精讀的場景,比如銀行存款,就不能用浮點數了。

怎麼代替浮點數要看業務需求了。

3樓:陳斌

計算精確度的問題,計算過程中如果數值的誤差積少成多,會不會因此造成判斷錯誤是需要考慮的bug.雖然很多時候我們只需近似計算.有些問題也只能近似計算,比如圓周率pi,還有e.

有些函式也是近似,比如三角函式.但有些近似計算可以避免的,比如用兩整數之比代替浮點數.用乘方代替一些無理數.等

4樓:王富貴

// 浮點數相乘

function mul(a, b) catch (f) {}try catch (f) {}

return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);

// 浮點數相除

function div(a, b) catch (g) {}try catch (g) {}

return c = Number(a.toString().replace(".

", "")), d = Number(b.toString().replace(".

", "")), mul(c / d, Math.pow(10, f - e));

5樓:ZhangML

以遊戲專案開發來說有一些特定的型別如RTS、MOBA遊戲由於PVP戰鬥採用幀同步方案需要保證多個客戶端的遊戲數值的一致性,一般會避免使用浮點數運算而採用定點數代替浮點數,並且自己實現有限的數學庫(三角函式,開方等)

但是對於小數精度要求不高或者遊戲數值由伺服器決定的遊戲其實並不限制浮點數的使用

6樓:布客飛龍

你聽沒聽說過有理數?它可以表示成兩個整數的比值。

小數裡面的有限小數,以及無限迴圈小數,都屬於有理數。對於這樣的數,你可以用兩個int 來表示,也可以用乙個double,都是等長的,但是準確度和效率差了十萬八千里。

對於一些位數固定的小數,你還可以把分母省掉,比如上面提到的金額。

而且,有理數的加減乘除全是封閉的。也就是,普通業務邏輯,不會超過這個範圍。

現實世界的小數和浮點不是完全對應的,在數學上,小數本身就不是乙個類別,有限小數和無限迴圈小數屬於有理數,其它的屬於無理數。你要是用浮點表示有理數,那就是把本來精確的表示變得不精確了。

所以小數能不能用浮點表示,不能一概而論。要看它屬於哪個分類。

7樓:無敵帥猴

線上交易系統,設計金額欄位時,要用long型,不能用double或者float型別。否則會發生丟失一分錢的精讀問題。引起資損和對不上帳這兩個問題。

8樓:王兆明

基於幀同步的網路遊戲同步要避免使用浮點數,原因是玩家操作作為輸入,要求所有終端裝置上計算結果的輸出要完全一樣,浮點數做不到

9樓:

沒必要避免使用浮點數,要避免使用浮點數的裝置是8位mcu就是常說的51微控制器,因為記憶體實在太少了,節,速度太慢了,12M。只要不是這樣的機器,哪怕386用浮點數都沒什麼大不了的,我還建議用double型別,不差那麼的記憶體和cpu。

10樓:影月

嚴重反對@pansz

這是在重度誤導其他人

浮點數出現誤差決不是由於進製變換!

這是乙個嚴重的錯誤!

浮點數出現計算誤差,是由於表示精度有限

表示精度有限

表示精度有限!

重要的事情說三次

通常的浮點數有效數字,二進位制有二十多位,再多精度就只能拋棄!

這才是出現錯誤的根源!

要舉例子也很簡單!

1.0+(2的負25次方)*100000

這裡乘法如用迴圈累加方式的話

結果是不相等的!

這跟進製變換沒任何關係!

再提乙個反直覺,但有些人會不留意的事

浮點數的加法結合率是不成立的!

(當然還有其他的一些也是不成立)

我真不敢相信,乙個連加法結合率都不成立的資料型別,居然有人說可以放心使用

11樓:馳天麒麟

這個問題的前提是一些微控制器的專案吧?有些微控制器或者嵌入式系統沒有浮點運算單元,一旦用了浮點數,編譯器會用整型或者定點替代浮點,為了達到與浮點相同的運算精度會耗費很多的記憶體和時鐘週期,造成效能的損耗。對於記憶體夠大,浮點運算性能夠強的系統來說,除了個別情況,用浮點對效能的影響不大,沒必要避開浮點。

12樓:freddy

浮點數一般終點輸出才用。

routine內部運轉的話用浮點數很容易出bug。

bug來由主要是因為浮點數的精確度問題。

假如我要對比兩個值。那麼我要0.1,浮點數回歸很容易變成 0.09999999。

所以對於初學者來說,能用int就不要用double long之類的。

13樓:Six666

剛畢業的嵌入式假程式猿一枚,第一次寫

少用浮點對做嵌入式還是很重要的。

尤其是低成本系統,比如8051,st的大部分晶元,沒有硬體支援浮點運算,如果非要計算小數會使系統變得很慢,滿足不了效能需求。

計算時候盡量會採用計算時擴大,得到餘數繼續擴大再組合的處理方式,顯示的小數其實無關計算結果,把小數點亮了,就是小數,不點亮就是整數,舉個栗子

eg: 要計算X/5,並顯示結果。(X可能是小數結果可能是)

1.根據專案需求取到小數點後n位;

2.然後乘以10的n次方,然後除以5取商,取餘,用兩個變數儲存商和餘(a和b)

3.然後將b擴大十倍除以5得到商c;

4.然後兩個顯示a,顯示c,小數點不在c前,因為前邊擴大了,要在原來基礎上前移n位

1.採集的資料是小數點後兩位,比如6.66,擴大100倍,為666;

2.除以5得到a=133,b=1

3.b擴大十倍除以5得到c=2

4.顯示整數就是a和c的組合133.2,擴大10的2次方,前移兩位,1.332,

這就是嵌入式程式猿的計算節奏,只是應了不用浮點計算,結果快沒快,我就不知道了

14樓:by wang

要是放在控制領域是沒錯的,浮點導致精度有問題,基本都是定點,而且取樣回來的也都是定點數,本身訊號都標么以後使用定點,都是標準化流程。很小的數在很多演算法裡會產生額外的問題,一般都是有乙個特殊處理方法,如樸素貝葉斯,連乘取對數變成加,但是也不是浮點或定點的鍋。

15樓:

用的long【

最後因為包一層物件慢出翔還是用回了float【(只能認為加減乘除平方根是確定性的,與e相關的都泰勒展開)(體驗就是如果你知道在比較之前如何盡量避免除法和平方根,將其轉換為乘法,還是有救的【

16樓:丁一帆

只有那種只會用一種語言的傢伙才會覺得要避免浮點數吧自己寫過很劣質的矩陣求逆,的確用浮點數會造成相當大的誤差(和matlab相比)

然而造成誤差的級別,至少要是幾十階的矩陣求逆啊什麼的,才會差個零點幾就普通的加減乘除?那個浮點,不要考慮了

如果用GPU加速的話,浮點不見得比定點差勁在CPU上跑,定點的速度比浮點快才是這種偏見的源頭

17樓:

問題缺少前提條件,如果是MCS-51類專案,這是對的。

如果是計算金錢累計類題目,也是對的,要用以分(或者釐?)為單位的整數計算和儲存,輸出的時候打個小數點。

18樓:

整型的老有溢位問題,浮點挺好,該用就得用,不然煩的一公尺,自已用整理,別人介面是浮點,你就煩了,如果資料另外有人再要浮點,你更煩,工作過程親身經歷,被整型搞的很慘,尤其煩word

19樓:靈劍

f**k,你用定點數給我算乙個傅利葉變換我看看……

算錢的時候為了遷就人類的十進位制,可以儲存為100 * 金額的乙個整數。但是你利率之類的用什麼表示呢?年化利率要折算成月利率,定點數你來個精確的開12次方?

精度控制從來就不是用什麼資料型別的問題,而是一門獨特的學問,涉及到許多微分方程穩定性、差分方程穩定性之類的數學原理,現在不知道什麼沒學過數值計算的牛鬼蛇神都在寫程式,才搞出來這種亂七八糟的經驗談,跟五行風水有什麼區別。

20樓:噼噼啪啪粉兔子

1.看需求

像以上各位大佬分析的那樣,如果你的程式所用範圍不會用到二進位制無理數,直接用浮點無妨

2.decimal

3.我有乙個大膽的想法:

遇上了就用IF調整精度?

21樓:余世傑

也要看是什麼專案吧。如果你是在有浮點處理單元的裝置上執行的程式,且執行效率不低,那為什麼還要避免使用浮點數呢?如果你是部分嵌入式裝置,根本不具有浮點計算能力,或者你的程式對效率要求極高,又涉及到大量的浮點數運算,那你可以考慮對程式進行定點化來避免這個問題。

總的來說,通過定點化將浮點數轉化為整數是乙個硬體裝置不到位的無奈之舉,連使用單精度float和雙精度double的不同都能影響現在火熱的深度學習效果。

22樓:喬捷

程式設計中避免使用浮點數是扯淡,當然浮點數不適用的場合,比如計算金額的時候通常就要避免使用浮點數。除了浮點數之外還有定點數,浮點數有很大的取值範圍,但是不同大小的浮點數精度是不一樣的,絕對值越大精度越低。而定點數則相反,取值範圍很小,但是精度是固定的,不管大多的數小數點後的有效位數都是一樣的。

23樓:野龍

簡單來說,浮點數是不準確的,所以你如果要求沒有誤差,就不應該用浮點數。舉個例子,金融資料,誰也不希望算著算著就出了差錯對吧。。。

除此之外的各種科學計算,本來就容許誤差的,就用浮點就好,但是要注意控制誤差。具體情況請去複習數值分析。

24樓:陳碩

大概我在摩根那幾年寫的是假的外匯交易系統。

在這個題目下面我注意到乙個有意思的現象:真正從事金融行業的程式設計師對浮點數有正確的認識,知道什麼時候該用(利率、匯率等等)。反倒是有一些外行,在傳授「金融領域應該避免浮點數」的「經驗」。

25樓:葉飛影

用不用浮點數,應該由需求中對精度的要求決定。

舉個例子,假如用float型別表示你要給我多少錢:

如果你付我10萬多塊,可能會出現幾分錢的錯誤;

如果你付我100萬多塊,可能會出現幾毛錢的錯誤;

如果你付我1000萬多塊,可能會出現幾塊錢的錯誤;

如果你付我1億多塊,可能會出現幾十塊錢的錯誤;

如果你付我10億多塊,可能會出現幾百塊錢的錯誤;

如果你付我100億多塊,可能會出現幾千塊錢的錯誤;

......

對於這樣的誤差錯誤,我完全可以接受,所以我就這麼用。

如果你不接受這種錯誤,可以用整型int或long long來表示,數值單位為分。

此外,你還需要知道浮點數能表示數值的範圍和精度:

1. 範圍

float和double的範圍是由指數的位數來決定的。

float的指數字有8位,

double的指數字有11位,分布如下:

float:

1bit(符號位) 8bits(指數字) 23bits(尾數字)

double:

1bit(符號位) 11bits(指數字) 52bits(尾數字)

那麼,float的指數範圍為-127~+128,double的指數範圍為-1023~+1024,並且指數字是按補碼的形式來劃分的。

其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。

float的範圍為-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍為-2^1024 ~ +2^1024,也即-1.

79E+308 ~ +1.79E+308。

2. 精度

float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是乙個隱含著的「1」,由於它是不變的,故不能對精度造成影響。

float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。

為什麼叫浮點數

道不輕傳 定點數能表示的數字有限,因為小數點固定,整數字和小數字就固定,就不利於表達特別大或特別小的數,浮點數就可以表示很大或很小的數字,因為小數點不固定,比如 123.45 用十進位制科學計數法可以表達為 1.2345 10 其中 1.2345 為尾數,10 為基數,2 為指數。浮點數利用指數達到...

使用 epsilon 比較浮點數是否不夠科學?

感覺基本都是從理論角度分析的,我來從ISA和硬體實現的角度簡單說一下吧 1,常用函式的數值演算法,基本不是級數展開 區間擬合,就是構建在sqrt,log2,exp2等等基本函式之上,而這些基本函式不論軟硬體實現也仍然是級數展開。既然是擬合,那自然不能強求完全bitexact的結果。只能要求最終返回的...

Python中為什麼將浮點數賦值給變數,似乎可以直接使用 號進行比較?

邱昊宇 這玩意兒換成 C 也沒啥兩樣呀 include define print v printf s n v True False intmain 編譯執行以後的輸出一模一樣。自己把這些數換成二進位制然後保留 53 位有效數字算一算就知道了。那幾個可以用 判斷的,是因為左右兩邊真的相等。但是這種相...