我正在处理中读取串行值。一个例子:
...
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
具有与以前相同的值。我猜您的输入流中有一些空行或非法值。您的程序无法将这些解析为浮点,抛出异常,然后继续执行。