glam-rs
glam-rs copied to clipboard
Respect precision format specifiers in Vec3::display
Currently, the floating point value is display in full, which creates way too many decimals than are necessary for displaying e.g; position.
If it is not possible to respect format precision, it would be better if a precision of e.g 4 or 5 was used.
Example:
[ 0.000000323, 0.0233232, 3.42323 ]
rather than
[ 0.0, 0.0233, 3.423 ]
I think this is rather subjective. In some cases, floating point equality is useful (often when comparing against 0.0
) and the example you gave would make this highly confusing if you were debugging something that wasn't working as expected.
I think I know what you are getting at @ten3roberts but it might help to include example code.
Of course.
The following example demonstrated the slight problem I am having
let pos = Vec3::new(0.00000000000004, 0.5, 1.0);
println!("Pos: {:.2}", pos); // Pos: [0.000000000004, 0.5, 1]
println!("Pos: [{:.2}, {:.2}, {:.2}]", pos.x, pos.y, pos.z); // -> Pos: [0.00, 0.50, 1.00]
It happens in physics simulations where you have something slowing down but never due to a proportional force, and I would like to round the result. E.g where lim x->inf f = 0
The code for that example
write!(
f,
concat!(
"frametime: {:.<7.1?} | {:>2.1}/s\n",
"elapsed: {:.2?}\n",
"pos: {:.2}\n",
"vel: {:.2}\n",
),
self.frametime,
1.0 / self.frametime.as_secs_f32(),
self.elapsed,
self.pos,
self.vel,
)?;
Ok(())
I noticed that Debug
printing will respect the precision values because the way it is implemented is different to Display
.
You can kind of work around this to get what you want:
use glam::*;
fn main() {
let f = 1.000123;
let v = Vec2::new(f, f + f);
println!("{}", f);
println!("{:.2}", f);
println!("{}", v);
println!("{:.2?}", v);
println!("{:.2?}", v.as_ref());
}
prints
1.000123
1.00
[1.000123, 2.000246]
Vec2(1.00, 2.00)
[1.00, 2.00]
So you can get the output that you want with the last one :)
It should be possible to make Display
use the precision value, it just looks a bit verbose implementation wise unfortunately.
I suppose the above trick works because as_ref
converts the vector to a slice.
In that case, the display trait could be implemented to just forward to the slice Display implementation, which means we will get all the features and formats correctly.