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



我正在处理中读取串行值。一个例子:

...
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);
}

不出所料,它印了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);
}
}
}

粘贴输入&输出

我已经在下面的站点粘贴了输出的未桥接版本。第一种是没有算术运算的输出;则存在一行###,然后执行算术之后的值。

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

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

当抛出异常时,val具有与以前相同的值。我猜您的输入流中有一些空行或非法值。您的程序无法将这些解析为浮点,抛出异常,然后继续执行。

最新更新