av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

java - 浮點數如何比較是否相等或者如何判斷某個浮點數是否為0?

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

問題描述

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

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

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

問題解答

回答1:

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

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

回答2:

浮點數的比較還是要根據實際存儲規則來,因為浮點數是以二進制來存儲的,而用二進制表示十進制是不能精確表示的,即使浮點數的十進制有效數字比較少,那也不一定能用二進制精確表示。為什么呢?首先浮點數小數位的二進制是這樣對應的:小數后1位:0.5 (2^-1)小數后2位:0.25 (2^-2)...小數位n位:2^-n也就是說,任何一個浮點數的小數部分都是由2^-1 ... 2^-n組合而成的,這樣就能理解為什么有效位數少的浮點數也不能精確表示了,比如0.3,就無法用上面的位數組合而精確表示出來,不信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,那就可以了,因為0.5可以用2^-1精確表示啊!同理,0.625也可以。那我們平時為什么cout << 0.3;可以直接輸出0.3呢?那是因為cout默認做了舍入處理

回到樓主的問題:如果是直接判斷0.3 == 0.3,那沒問題,因為同樣的數字做了同樣的表示,所以可以直接用’==’。如果是可以精確表示的數,比如0,則更是如此了。但是如果判斷0.1+0.2和0.3是否相等,那就不行了,因為他們都有精度損失,而損失的數值又不一樣,所以不能直接比較需要用abs((0.1+0.2) - 0.3)<EPSILON這樣的方法。

回答3:

計算機表示浮點數(float或double類型)都有一個精度限制,對于超出了精度限制的浮點數,計算機會把它們的精度之外的小數部分截斷。因此,本來不相等的兩個浮點數在計算機中可能就變成相等的了。例如:

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

標簽: java
相關文章:
主站蜘蛛池模板: 日本黄色视屏 | 日韩中文字幕一区二区三区 | 成年人黄色片 | 国产91精品看黄网站在线观看 | www一区二区 | 97视频| 欧美成人精品欧美一级乱黄 | 六月色婷婷| 日本性网站 | av黄色在线观看 | 诱人的大乳奶3做爰 | 少妇视频在线观看 | 日韩免费在线播放 | 99色综合 | 97在线观看免费视频 | 亚洲一区中文 | 色综合五月天 | 成人小视频在线观看 | 婷婷激情综合网 | 欧美在线观看一区二区 | 人人艹人人爱 | 日本一级淫片色费放 | 日韩精品一二区 | 午夜免费小视频 | 日韩欧美在线视频观看 | 亚洲激情综合网 | 99热亚洲 | 日韩在线免费播放 | 天天操免费视频 | 欧美性精品 | 日韩一区二区免费视频 | 成人羞羞国产免费游戏 | 欧美日韩毛片 | 国产精品一区二区三 | 99视频免费观看 | 精品国产乱码久久久久 | 免费看a级片 | 欧美日韩亚洲天堂 | 午夜在线国语中文字幕视频 | 91看片看淫黄大片 | 亚洲人成在线播放 |