2014-02-25 32 views
1

我正在讀取處理中的序列值。一個例子:什麼使這個簡單的處理算法失敗?

... 
297.5 
297.1 
297.1 
... 

這些數字不會比這裏顯示的變化多得多。

然後,我運行下面的代碼:

if (val > 100) { 
    println(val); 
} 

它打印正是我上面寫的。

然後我運行此代碼:

if (val > 100) { 
    val -= 230; 
    val *= 2; 
    println(val); 
} 

它打印出大相徑庭的數字:

... 
-189.59998 
136.0 
-188.0 
135.0 
-190.0 
... 

思考的東西是扭曲我的數學(但如何?!),我減少了我的代碼對此:

if (val > 100) { 
    val -= 230; 
    println(val); 
} 

它打印,如預期,67ish。

val *= 2有什麼問題?

我能想到的唯一的事情就是我爲'float'數據類型分配的內存'溢出',所以它'滾動'爲負數......但這怎麼可能?我認爲Processing只是Java的一個薄弱環節。


全碼

import processing.serial.*; 

Serial s; 
float val; 

void setup() { 
    size(600, 400); 
    String portName = Serial.list()[1]; 
    s = new Serial(this, portName, 9600); 
    s.bufferUntil('\n'); 
} 

void draw() { 
    if (s.available() > 0) { 
     try { 
      val = Float.parseFloat(s.readStringUntil('\n').trim()); 
     } 
     catch (Exception e) { 
     } 

     if (val > 100) { 
      val -= 230; 
      val = val * 2.0; 
      println(val); 
     } 
    } 
} 

粘貼輸入輸出&

我在下面的站點粘貼輸出的刪節版。第一種是沒有算術的輸出;然後有一行###,然後執行算術後的值。

http://pastebin.com/raw.php?i=Du7TmZFv

+0

只是一個猜測,但怎麼樣val * = 2.0; –

+0

那是我的第一個念頭 - 不幸的是,沒有雪茄! :( – j6m8

+0

浮動VAL = 297.1f; \t \t VAL - = 230; \t VAL * = 2; \t的System.out.println(VAL);爲我工作和結果是134.20001, – Jabir

回答

6

罪魁禍首是catch(Exception e){}。永遠不要這樣做。

當拋出異常時,val與之前的值相同。我猜你的輸入流中有一些空行或者一些非法的值。你的程序無法將這些解析爲浮點數,拋出異常,然後繼續向前。

+0

這是一個壯觀的捕獲,哇 - 謝謝!爲了發佈這個問題,我非常關注縮小我的代碼,以便刪除我的「catch」塊 - 從而給我自己帶來了比以前更大的問題。哎呦! – j6m8

相關問題