A "live example":
tclsh8.5 [~/tmp]set a -0
-0
tclsh8.5 [~/tmp]puts [::tcl::mathfunc::int $a]
0
tclsh8.5 [~/tmp]puts [::tcl::mathfunc::abs $a]
-0
...above explains the problem. But, as the others mentioned already:
% expr {abs(-0)}
0
...works fine.
Logged In: YES
user_id=80530
Originator: NO
% foreach c [info commands tcl::mathfunc::*] {
catch {$c 0} a
catch {$c -0} b
if {$a ne $b} {puts $c}
}
::tcl::mathfunc::round
::tcl::mathfunc::abs
::tcl::mathfunc::entier
::tcl::mathfunc::min
::tcl::mathfunc::max
These are the five mathfunc commands
that return surprising, if not simply
wrong, answers when passed -0.
Logged In: YES
user_id=80530
Originator: NO
The general issue is whether mathfunc
commands can, unlike [expr], return
non-canonical string reps:
% tcl::mathfunc::abs 0x0
0x0
% expr abs(0x0)
0
% tcl::mathfunc::abs 1.2345678901234567890123456789
1.2345678901234567890123456789
% expr abs(1.2345678901234567890123456789)
1.2345678901234567
Logged In: YES
user_id=80530
Originator: NO
Since tcl::mathfunc commands are
general Tcl commands, and programmers
are invited to create their own, there's
no systemic way to address this.
We can certainly follow a practice
with our own built-in commands that
they return canonical strings only, if
we wish. Is it useful to do so?
Logged In: YES
user_id=80530
Originator: NO
dgp I think the max and min implementations we have are good. Actually returning one of the arguments seems like a positive thing.
dgp The docs for them might be enhanced a bit.
dgp not "greatest value", but "first argument not less than any other argument"
% namespace path tcl::mathfunc
% max 0x1 1
0x1
% max 1 0x1
1
Logged In: YES
user_id=80530
Originator: NO
The [abs] results are the greatest concern.
They can leak into [expr] results as well:
% expr {abs(-1e-323)}
1e-323
% expr {abs(-1e-324)}
-0.0
Logged In: YES
user_id=80530
Originator: NO
Committed fix for abs().
For now, I consider other issues
raised here to be "not a bug".
Logged In: NO
Where is the patch?