是什么让这个简单的处理算法失败?

j6m*_*6m8 1 java math processing

我正在阅读Processing中的序列值.一个例子:

...
297.5
297.1
297.1
...
Run Code Online (Sandbox Code Playgroud)

这些数字的变化不会比这里显示的多得多.

然后,我运行以下代码:

if (val > 100) {
    println(val);
}
Run Code Online (Sandbox Code Playgroud)

它打印的正是我上面写的.

然后我运行这段代码:

if (val > 100) {
    val -= 230;
    val *= 2;
    println(val);
}
Run Code Online (Sandbox Code Playgroud)

它打印出截然不同的数字:

...
-189.59998
136.0
-188.0
135.0
-190.0
...
Run Code Online (Sandbox Code Playgroud)

认为某些事情与我的数学有关(但是如何?!),我把我的代码减少到了这个:

if (val > 100) {
    val -= 230;
    println(val);
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它打印出67.

有什么问题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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

粘贴输入和输出

我在以下网站粘贴了未删节版本的输出.第一个是没有算术的输出; 然后有一行###,然后执行算术后的值.

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

Daw*_*ica 6

罪魁祸首是catch(Exception e){}.永远不要这样做.

抛出异常时,val它具有与之前相同的值.我猜你的输入流中有一些空白行或一些非法值.您的程序无法将这些解析为浮点数,抛出异常,然后继续向前.