After playing with the new quantity system in Mathematica 9 for a while, I keep stumbling over this issue:
0 * Quantity[1, "Meters"]
is not the same as
1 * Quantity[0, "Meters"]
The first is dimensionless 0, the second is 0 meters, and a dimensionless quantity can't be added to or converted to a length like meters.
Take e.g. this simplified example:
startPoint = Quantity[1, "Meters"];
endPoint = Quantity[5, "Meters"];
Manipulate[
UnitConvert[a*endPoint + (1 - a)*startPoint, "Inches"], {a, 0, 1}]
The manipulate converts a point along a line to inches. It works for any setting of a, except 0. and 1., where I get UnitConvert[0. + Quantity[1., "Meters"], "Inches"] instead of a proper length. Generally speaking, it seems that any expression that contains a dimensionless subexpression that can be 0 might break somewhere in your Manipulate, Table or Animate. This seems extremely fragile to me.
Is this a bug? Or am I using Quantity wrong? Should I avoid dimensionless expressions completely? Or avoid Quantity inside dynamic code?
Answer
While it would've been nice if the package handled it automatically, it can be fixed with a simple overloading of Quantity:
Unprotect@Quantity;
Quantity /: (0 | 0.) Quantity[_, unit_] := Quantity[0, unit]
Protect@Quantity;
You can add this to your init.m, so that you don't have to define it each time. You can test your examples with this:
0. Quantity[1, "Meters"]
(* 0 m *)
0 Quantity[1, "Meters"]
(* 0 m *)
Comments
Post a Comment