2013-10-29 161 views
4

我對awk的行爲感興趣,同時執行浮點數的計算。它導致我對錶格數據進行錯誤的計算。awk中的浮點計算

$ awk 'BEGIN {print 2.3/0.1}' 
23 <-- Ok 
$ awk 'BEGIN {print int(2.3/0.1)}' 
22 <-- Wrong! 

$ awk 'BEGIN {print 2.3-2.2==0.1}' 
0 <-- Surprise! 
$ awk 'BEGIN {print 2.3-2.2>0.1}' <-- Din't produce any output :(
$ awk 'BEGIN {print 2.3-2.2<0.1}' 
1 <-- Totally confused now ... 

有人可以指出什麼在這裏?

EDIT 1

正如指出由@fedorqui,第二最後一個命令的輸出變爲文件名爲0.1因爲重定向操作符(>)的。

那麼我該如何執行大於>)的操作?

解決它也被@fedorqui

$ awk 'BEGIN {print (2.3-2.2>0.1)}' 
0 <-- Wrong! 
+3

+1有趣的問題。我發現了一些信息 - > http://www.gnu.org/software/gawk/manual/html_node/Floating-Point-Issues.html還要注意'awk'BEGIN {print 2.3-2.2> 0.1}''寫道名稱爲'0.1'的文件中'2.3-2.2'的結果。 – fedorqui

+0

@fedorqui我也搜索了這個話題。他們所說的只是預料之外的行爲!我該如何準確解決我的問題?我嘗試用'perl'解決問題,但不幸的是,它也可能以不同的方式行事。 – jkshah

+0

@fedorqui感謝您指出。我用更新查詢更新了問題! – jkshah

回答

8

manual以下部分給予幫助你瞭解問題您看到的是:

15.1。 1.2浮點數不是抽象數字

與抽象意義上的數字不同(例如您在學校或大學算術中以高位 研究的內容)時,存儲在計算機中的數字在某些方面受限於 。他們不能代表無限的數字, 也不能完全代表事物。特別是,浮點數不能總是精確地表示值。下面是 一個例子:

$ awk '{ printf("%010d\n", $1 * 100) }' 
515.79 
-| 0000051579 
515.80 
-| 0000051579 
515.81 
-| 0000051580 
515.82 
-| 0000051582 
Ctrl-d 

這表明一些值可以精確表示,而其他 僅近似。這不是awk中的「bug」,而僅僅是計算機如何表示數字的人爲因素。


一個高度推薦閱讀:

What every computer scientist should know about floating-point arithmetic

+0

不想花費15美元 – KevinDTimm