[chuck-users] int/float conversion oddity (48.0000 = 47)
Ge Wang
gewang at CS.Princeton.EDU
Tue Oct 11 19:37:10 EDT 2005
Hi Graham and all,
I believe this is due to floating point (non)precision. 'foo' may
actually have the value 47.99999999, and when printed out to 6 decimal
places, is rounded up to 48 by the output formatting. However, the cast
to int truncates that to 47.
A dumb test (casting foo + .00000001):
std.mtof(std.ftom(48)) => float foo;
<<< foo >>>;
(foo + .00000001) $ int => int bar;
<<< bar >>>;
results in:
48.000000 :(float)
48 :(int)
It may be safer to round in many cases. For non-negegative values,
either add .5 and cast the result to int, or call math.round and cast the
result to int. For negative values, subtract .5 or use math.round.
In testing this, we found that math.round (on win32 only) returns the
incorrect result for negative numbers. This is now fixed in CVS and will
be part of 1.2.0.2.
Additionally, both std.mtof and std.ftom were previously implemented
using single-precision, which would account for the (~.00000001)
non-identity of mtof(ftom). I just changed both to use double precision,
and now the original code all print 48 :(int). This will also be in
1.2.0.2.
Thanks for finding this!
Best,
Ge!
On Mon, 10 Oct 2005, Graham Percival wrote:
> std.mtof(std.ftom(48)) => float foo;
> <<< foo >>>;
> foo $ int => int bar;
> <<< bar >>>;
> std.mtof(std.ftom(48)) $ int => int baz;
> <<< baz >>>;
>
>
> On OSX 10.3.9, using chuck 1.2.0.1, this results in:
> 48.000000 :(float)
> 47 :(int)
> 47 :(int)
>
>
> Cheers,
> - Graham
>
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>
More information about the chuck-users
mailing list