国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

java - 浮點(diǎn)數(shù)如何比較是否相等或者如何判斷某個(gè)浮點(diǎn)數(shù)是否為0?

瀏覽:98日期:2023-10-14 16:54:54

問題描述

大家應(yīng)該都知道浮點(diǎn)數(shù)存在精度問題,所以問題就來了,我如何才能判斷兩個(gè)數(shù)是否近似相等,或者某個(gè)浮點(diǎn)數(shù)是否為0。其實(shí)這是一個(gè)問題,對(duì)于前者,我們需要二者作差,然后與0進(jìn)行比較。這樣前者與后者就是同一個(gè)問題了,即如何判斷某個(gè)浮點(diǎn)數(shù)是否為0。我所知道的比較簡單但是不是很好的方法就是使用1e-7或者更小的數(shù),如下所示(以單精度為例):

#include <iostream>#include <cfloat>using namespace std;int main(){ float num; cout << '輸入一個(gè)數(shù):'; cin >> num; if (num < 1e-7 && num > -1e-7)cout << num << '近似為0' << endl; elsecout << num << '不近似為0' << endl; return 0;}

上述方式以C++代碼為例。由于不同編程語言有不同的處理方式,大家可以不限制使用任何編程語言。當(dāng)然,如果您有更通用的方式當(dāng)然再好不過了。

問題解答

回答1:

多小才是“足夠小”,應(yīng)該是由處理的具體問題決定的。比如用double表示金額的話,1e-4就可以認(rèn)為是零了。而如果進(jìn)行科學(xué)計(jì)算,恐怕1e-7還嫌太大。

<cfloat>中有定義DBL_EPSILON為與1.0最接近的差值。參見這里。

回答2:

浮點(diǎn)數(shù)的比較還是要根據(jù)實(shí)際存儲(chǔ)規(guī)則來,因?yàn)楦↑c(diǎn)數(shù)是以二進(jìn)制來存儲(chǔ)的,而用二進(jìn)制表示十進(jìn)制是不能精確表示的,即使浮點(diǎn)數(shù)的十進(jìn)制有效數(shù)字比較少,那也不一定能用二進(jìn)制精確表示。為什么呢?首先浮點(diǎn)數(shù)小數(shù)位的二進(jìn)制是這樣對(duì)應(yīng)的:小數(shù)后1位:0.5 (2^-1)小數(shù)后2位:0.25 (2^-2)...小數(shù)位n位:2^-n也就是說,任何一個(gè)浮點(diǎn)數(shù)的小數(shù)部分都是由2^-1 ... 2^-n組合而成的,這樣就能理解為什么有效位數(shù)少的浮點(diǎn)數(shù)也不能精確表示了,比如0.3,就無法用上面的位數(shù)組合而精確表示出來,不信cout試試:

#include <iostream>#include <iomanip>int main(){ float a = 0.3f; std::cout << std::setprecision(32) << a << std::endl; return 0;}

輸出:0.30000001192092896而如果把0.3換成0.5,那就可以了,因?yàn)?.5可以用2^-1精確表示啊!同理,0.625也可以。那我們平時(shí)為什么cout << 0.3;可以直接輸出0.3呢?那是因?yàn)?b>cout默認(rèn)做了舍入處理。

回到樓主的問題:如果是直接判斷0.3 == 0.3,那沒問題,因?yàn)橥瑯拥臄?shù)字做了同樣的表示,所以可以直接用’==’。如果是可以精確表示的數(shù),比如0,則更是如此了。但是如果判斷0.1+0.2和0.3是否相等,那就不行了,因?yàn)樗麄兌加芯葥p失,而損失的數(shù)值又不一樣,所以不能直接比較需要用abs((0.1+0.2) - 0.3)<EPSILON這樣的方法。

回答3:

計(jì)算機(jī)表示浮點(diǎn)數(shù)(float或double類型)都有一個(gè)精度限制,對(duì)于超出了精度限制的浮點(diǎn)數(shù),計(jì)算機(jī)會(huì)把它們的精度之外的小數(shù)部分截?cái)唷R虼耍緛聿幌嗟鹊膬蓚€(gè)浮點(diǎn)數(shù)在計(jì)算機(jī)中可能就變成相等的了。例如:

float a=10.222222225,b=10.222222229數(shù)學(xué)上a和b是不相等的,但在32位計(jì)算機(jī)中它們是相等的。如果兩個(gè)同符號(hào)浮點(diǎn)數(shù)之差的絕對(duì)值小于或等于某一個(gè)可接受的誤差(即精度),就認(rèn)為它們是相等的。不要直接用“==”或者“!=”對(duì)兩個(gè)浮點(diǎn)數(shù)進(jìn)行比較,但是可以直接用“<”和“>”比較誰大誰小。

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 久久青草免费线观最新 | 麻豆19禁国产青草精品 | 国产90后美女露脸在线观看 | 自拍偷拍亚洲区 | 手机看片福利视频 | 狠狠五月深爱婷婷网 | 男人的天堂毛片 | 国产成人亚洲精品91专区高清 | 久久久久国产免费 | 91久久国产综合精品女同国语 | 国产一级视频在线 | 一区二区三区 亚洲区 | 国产精品人成人免费国产 | 国内精自品线一区91 | 午夜毛片网站 | 一级毛片视频免费观看 | 成人免费的性色视频 | xx毛片| 奶交性视频欧美 | 中文字幕在线观看一区二区 | 亚洲人成日本在线观看 | 国产或人精品日本亚洲77美色 | 91手机看片国产福利精品 | 三级c欧美做人爱视频 | 欧美三级成人观看 | 精品中文字幕久久久久久 | 中文字幕一区中文亚洲 | 99色视频在线观看 | 精品玖玖玖视频在线观看 | 欧美特级特黄a大片免费 | 亚洲欧美在线精品一区二区 | 性感美女视频免费网站午夜 | 亚洲精品久久片久久 | 欧美日韩一区二区三区免费不卡 | 一级做a爱久久久久久久 | 一级特黄aaa大片在线观看 | 亚洲精品99久久一区二区三区 | 亚洲 欧美 视频 | 亚洲成人美女 | 日韩区| 国产欧美日韩在线人成aaaa |