LabVIEW Pro 專業論壇-技術討論區-Round to nearest 四捨六入, 五不一定
 
     
 
 
 
LabVIEW 討論區基礎教學每月專題分享技術問題精選online Test
技術討論區 程式分享區 教育訓練與認證區 閒話家常區 工作機會討論區 回報區 ✦LabVIEW NXG 特區✦ 高手專訪系列 2017 LabVIEW 至尊爭霸賽
 熱門關鍵字 
    [期間限定 DAQ 卡優惠]    量測概念充電站    3小時內學會 LabVIEW    [取得 NI 協助]    [LabVIEW TOP 資源排行榜]
 您的位置:首頁 > 技術討論區 > Round to nearest 四捨六入, 五不一定
  技術討論區   板主:meiae
 之2(17篇)
[1] 2
Round to nearest 四捨六入, 五不一定 
 
newefamily

2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
 
字級設定

一般程式的 Round 都是四捨五入,為什麼 LabVIEW 沒有四捨五入的 Function,而是有四捨六入、五不確定呢?! 這是依據什麼標準來進位或去尾的呢?

 8.5 ==> round to nearest ==> 8

9.5 ==> round to nearest ==> 10

[+]放大圖片

已解決!轉到解決方案
  文章人氣: 32767 讚:0 文章日期:2010/06/28 11:20
timko


創始會員    
暱稱:timko
經驗值:625
等級:高手
發文:32
回文:298
版本:LabVIEW 2009
闖關狀態:
前往地圖:
1樓
字級設定

引言自 newefamily:
 

0.5~16.5 只需要8個bit即可處理,不像是 double 的關係吧?! 如果是的話, 不管用哪一種方法8.4999999 絕對不會等於 8.5000000 的。而且大大用的二種方式所得的答案不盡相同,代表Input 的值是相同的,並不是 Array2 接收到 8.4999999  Array3 接收到 8.500000。我覺得比較有可能是以下二種原因

1. Bug

2. Round to nearest 在初始定義上跟本就不是四捨五入,LabVIEW 沒有四捨五入的 Function,需要自己寫。


 

我說錯啦~這跟 double 的確沒有任何關係, 而是跟統計有關...
經過我網路上搜尋一番, 發現解釋的還蠻清楚的, 根據上面提的那個 banker's rounding, 當遇到 random 需求時才不會變成  biased rounding... 所以都是因為統計學上的原因, 才創造出這種做法, 遇到 0.5 時會 round 到偶數

而更漂亮的做法應該是先 + 0.5, 再 Round Toward - Infinity... 原本的程式再稍微改一下...

另外也看到這個人在討論各種語言的 Round, 還蠻有趣的...
http://www.dotblogs.com.tw/jeff-yeh/archive/2009/06/15/8834.aspx

.NET 的做法跟 LabVIEW 一樣

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
附件檔案:    
RoundToNearest01.vi
  版本:LabVIEW 2009
Front Panel
Block Diagram
 
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    讚:3 文章日期:2010/07/01 22:18
agody2000


創始會員    
暱稱:蔣公
經驗值:2092
等級:舵主
發文:33
回文:615
版本:LabVIEW 2011
闖關狀態:
飄渺嶺
前往地圖:
2樓
字級設定

最主要的一點

你當初輸入8.5的時候

你確定他是8.5000000000000000000000

還是8.4999999999999999999999

你沒辦法確定@@

所以自然就會有這個問題產生

這是沒辦法的

    讚:1 文章日期:2010/06/28 14:26
newefamily


2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
3樓
字級設定

大大的意思是說:『當我按 8.5 Enter 的時候,電腦收到的有可能是 8.499999999 嗎?』

    讚:0 文章日期:2010/06/28 15:30
agody2000


創始會員    
暱稱:蔣公
經驗值:2092
等級:舵主
發文:33
回文:615
版本:LabVIEW 2011
闖關狀態:
飄渺嶺
前往地圖:
4樓
字級設定

我就是這個意思

    讚:0 文章日期:2010/06/28 16:44
newefamily


2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
5樓
字級設定

再請教大大一個問題: 那要如何輸入8.5 Enter 之後, 讓電腦也接收到 8.5, 而不是 8.49999999 ?

需要加什麼嗎?

    讚:0 文章日期:2010/06/29 00:00
agody2000


創始會員    
暱稱:蔣公
經驗值:2092
等級:舵主
發文:33
回文:615
版本:LabVIEW 2011
闖關狀態:
飄渺嶺
前往地圖:
6樓
字級設定

我不是大大啦

我也在學習中

大家討論討論而已

關於你說的這個問題喔@_@

我不知道答案

電腦的精準度本來就會產生這類的問題

所以盡量避免去做一些動作

像是兩個實數去做等於    <=這種動作

 

不過有偷雞的方法

你自己先假設你可以容許的誤差在小數點幾位(假設5位好了)

然後把你現在的數值乘以10^5

然後取整數

在自己用判斷式來決定要不要砍掉10^5以內的那些整數項以及要不要進位

最後再去除以10^5

    讚:0 文章日期:2010/06/29 00:58
newefamily


2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
7樓
字級設定

大大: 我的資歷更淺, 還是尊稱你為大大好了!

想來想去還是覺得怪怪的: 我覺得輸入的值應該是8.5, 而不會是8.49999, 如果使用者輸入8.5, 電腦讀進來是8.49999會天下大亂吧! 如下圖

[+]放大圖片

    讚:0 文章日期:2010/06/29 08:15
timko


創始會員    
暱稱:timko
經驗值:625
等級:高手
發文:32
回文:298
版本:LabVIEW 2009
闖關狀態:
前往地圖:
8樓
字級設定

原因應該是出在 double 浮點數, 它是 64-bit, 所以是有極限的, 並非所有的數值都可以被完全表示 (小數點後的位數是有限制的...), 所以用 double 做部分處理或比較時要特別小心...

針對 Round To Nearest 的需求, 可以把程式改成這樣...

[+]放大圖片

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
附件檔案:    
RoundToNearest.vi
  版本:LabVIEW 2009
Front Panel
Block Diagram
 
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    讚:0 文章日期:2010/07/01 11:39
newefamily


2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
9樓
字級設定

0.5~16.5 只需要8個bit即可處理,不像是 double 的關係吧?! 如果是的話, 不管用哪一種方法8.4999999 絕對不會等於 8.5000000 的。而且大大用的二種方式所得的答案不盡相同,代表Input 的值是相同的,並不是 Array2 接收到 8.4999999  Array3 接收到 8.500000。我覺得比較有可能是以下二種原因

1. Bug

2. Round to nearest 在初始定義上跟本就不是四捨五入,LabVIEW 沒有四捨五入的 Function,需要自己寫。

    讚:0 文章日期:2010/07/01 12:15
newefamily


2013 LabVIEW 至尊爭霸賽參賽者    
暱稱:Aaron
經驗值:2673
等級:總舵主
發文:68
回文:989
版本:LabVIEW 2011
闖關狀態:
迷霧之森
前往地圖:
10樓
字級設定

忘了說明:小數點 0.5 在 2進制 的表示如下:

4bit: 1000

8bit: 10000000

16bit: 1000000000000000

32bit: 10000000000000000000000000000000

64bit: 1000000000000000000000000000000000000000000000000000000000000000

以上僅代表 0.5 不管是多少 bit, 後面只是補 0 而已(整數不含在內來討論)

    讚:0 文章日期:2010/07/01 12:24
 之2(17篇)
[1] 2
 
 
   會員中心 
帳號:
     
密碼:
     
  以後自動登入
 
註冊
   待回覆文章 
1. 正面迎戰5G新浪潮! 2017 NI 無線通訊量測與設計技術研討會報名中
2. RS232收封包跳號
3. Event Structure 硬體觸發問題
4. 新一代旗艦級軟體 LabVIEW NXG 開箱(中)
5. 新一代旗艦級軟體 LabVIEW NXG 開箱(下)
6. DAQmx出現亂碼
7. Rs232傳輸終止字元設定
8. 條碼槍問題
 
   Top 5 熱門討論 
1. 我想要用labview写一个同时对八个固定ip的stm32-wifi的单片机发出命令和接受回复
2. Labview與C溝通
3. 正面迎戰5G新浪潮! 2017 NI 無線通訊量測與設計技術研討會報名中
4. 小綠人製作 秒數與小綠人動作的平行運算(必須只用只用一個While loop)
5. 影像處理後畫面會不停閃爍
 
 
 
LabVIEW討論區 站長信箱 關於我們 站內聲明
國家儀器股份有限公司贊助;Sponsored by NI.
© 2010 National Instruments, Taiwan. All rights reserved. design by begonia