Menu

#324 Integers aren't strings anymore

closed-accepted
5
2005-11-05
2003-12-27
No

Throughout most of Tcl8, there has been a bug (or
malfeature of the tcl_precision variable) that two float
values can have identical string representations but
still behave differently when operated on. I hope that
TIP 132 will soon correct this.

Although floats have been slightly magical, one has
however always been able to rely on integers to not hide
any information from the string representation. Sadly,
that isn't true anymore. Behold:

% set l [expr 65536]
65536
% set w [expr {wide($l)}]
65536
% string equal $l $w
1
% expr {$l * 65536}
0
% expr {$w * 65536}
4294967296

In short, the bug is that [expr] lets its result depend
on details of the internal representation that are not
recorded in the string representation.

In a larger perspective, I think this is a symptom of a
failure to clearly decide what an integer should be in
Tcl, but sortinh that out requires a TIP. (IMHO the only
approach that has a chance of being consistent is to
allow arbitrarily long decimal strings as integers, as
now use efficient internal representations for integers
up to 32 or 64 bits, and rely on some callback similar
to [unknown] for all operations on larger numbers.)

Discussion

  • Don Porter

    Don Porter - 2003-12-31

    Logged In: YES
    user_id=80530

    Note this is assigned to Donal Fellows,
    who is only intermittently available
    during the holiday season.

    People interested in this report might
    want to have a look at TIP 72, and
    the compromises made to get 64-bit
    integer support into Tcl while limiting
    the incompatibilities introduced.

    http://purl.org/tcl/tip/72.html

     
  • Donal K. Fellows

    Logged In: YES
    user_id=79902

    Yuck.

    The problem is balancing between the real need for 64-bit
    values and the (unknown) quantity of code out there that
    assumes that int values are 32-bits wide. If it hadn't been
    for that (and the speed implications on 32-bit platforms),
    I'd have preferred to make all integers 64-bits wide on all
    platforms.
    Trying to do something with magic representation shimmering
    is unlikely to work well, since it is hard to make the
    processor math ops give some kind of trap when they lose
    information during the processing of ints. Getting a cheap
    way to perform the type guards is the critical part, that
    and defining a non-surprising way to deal with the situation
    (which currently escapes me.)

    If you want to try your hand at fixing math ops, their
    semantics are defined entirely within tclExecute.c; the
    math-related ops start at INST_EQ and are mostly
    self-explanatory (if long.)

     
  • Donal K. Fellows

    • labels: 105657 --> 105683
    • priority: 5 --> 1
     
  • Lars Hellström

    Lars Hellström - 2004-01-02

    Logged In: YES
    user_id=938835

    The quickest way of fixing this bug is probably to keep the
    behaviour of the bytecode instructions, but change the string
    representation of wides so that this behaviour becomes
    proper. Such a string representation could be as that
    generated by the [format] specifier

    wide(%d)

    since this has the merit of surviving an unbraced [expr].
    From this would then follow that anything matching the RE

    wide\(-?(0|[1-9][0-9]*|0[0-7]*|0x[0-9a-f])\)

    ought to be a valid integer. The main side-effect should be
    that output of wides which is not [format]ed may look a
    little strange, and that is probably acceptable.

     
  • Nobody/Anonymous

    Logged In: NO

    Question.
    Would making all Tcl integers 64 bit quantities
    actually make a *noticeable* difference to speed
    even on 32bit machines?

     
  • Donal K. Fellows

    Logged In: YES
    user_id=79902

    In speed terms, I don't think it would make much odds. Any
    string operations about will dominate for sure. :)

    The problem is the semantic difference; nobody's sure how
    much code exists out there that depends on 32-bit widths of
    values.

     
  • Donal K. Fellows

    • assigned_to: dkf --> nobody
    • milestone: 340709 -->
    • labels: 105683 -->
     
  • Donal K. Fellows

    Logged In: YES
    user_id=79902

    Doing anything about this "bug" requires a TIP and a great
    deal of head-scratching. Transferring to the FRQ track...

     
  • Donal K. Fellows

    • assigned_to: nobody --> dkf
    • labels: --> 10. Objects
     
  • Donal K. Fellows

    • assigned_to: dkf --> kennykb
    • priority: 1 --> 5
     
  • Kevin B KENNY

    Kevin B KENNY - 2005-05-10

    Logged In: YES
    user_id=99768

    TIP #132 doesn't fix this, but TIP #237 should.

     
  • Don Porter

    Don Porter - 2005-10-22

    Logged In: YES
    user_id=80530

    This ought to be fixed now.

    Comment here if not.

     
  • Don Porter

    Don Porter - 2005-10-22
    • assigned_to: kennykb --> dgp
    • status: open --> pending-accepted
     
  • SourceForge Robot

    Logged In: YES
    user_id=1312539

    This Tracker item was closed automatically by the system. It was
    previously set to a Pending status, and the original submitter
    did not respond within 14 days (the time period specified by
    the administrator of this Tracker).

     
  • SourceForge Robot

    • status: pending-accepted --> closed-accepted
     
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.