Thread from comp.lang.tcl (6 replies)

What value can cause this error?
Posted by alexandru.dadalau@meshparts.de (alexandru) 2 weeks 1 day ago

I got this error message from a customer and no further information is
available.
What could have caused this error?

integer value too large to represent
    while executing
"expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}"

I know that "val" is a proper number and that "decimals" is 6.

I tried to run this expression with very high "val" values and could not
reproduce the error.

Many thanks
Alexandru

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by Rich <rich@example.invalid> 2 weeks ago

alexandru <alexandru.dadalau@meshparts.de> wrote:
> I got this error message from a customer and no further information is
> available.
> What could have caused this error?
> 
> integer value too large to represent
>    while executing
> "expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}"
> 
> I know that "val" is a proper number and that "decimals" is 6.
> 
> I tried to run this expression with very high "val" values and could not
> reproduce the error.

Are you *absolutely* sure that decimals is 6, because I can generate 
the error via a smallish change to decimals:

    $ rlwrap tclsh 
    % set val 123
    123
    % set decimals 999
    999
    % expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}
    integer value too large to represent
    % set tcl_patchLevel
    8.6.12

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by alexandru.dadalau@meshparts.de (alexandru) 2 weeks ago

Actually yes, I'm sure.
I have the errorInfo that shows the stack of procedure calls.
The procedure is called with "decimals" equal to 6.
The the error is thrown.
The errorInfo does not show the value of variable arguments, so I don't
know that "val" was.
I also checked my source code an all the calls to that procedure never
use higher values than 6 for the second argument.
Here is the complete procedure:

proc NumberReadmm {val {decimals 3}} {
  if {![string is double -strict $val]} {
    return $val
  }
  return [expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}]mm
}

Here is the errorInfo:

*** ERROR ***
Time: Monday, das 16 von September, 2024, um 13:24:37
integer value too large to represent
    while executing
"expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}"
    (procedure "NumberReadmm" line 5)
    invoked from within
"NumberReadmm $contact_offset 6"
    (procedure "ContactOffsetFormat" line 7)
    invoked from within
"ContactOffsetFormat $contact_offset_min"
    (procedure "UIRelationApplyContactOffset" line 45)
    invoked from within
"UIRelationApplyContactOffset %W"
    invoked from within
".valid.notebook.f5.buttons.b2 invoke "
    invoked from within
".valid.notebook.f5.buttons.b2 instate !disabled {
valid.notebook.f5.buttons.b2 invoke } "
    invoked from within
".valid.notebook.f5.buttons.b2 instate pressed {
valid.notebook.f5.buttons.b2 state !pressed;
valid.notebook.f5.buttons.b2 instate !disabled { .valid..."
    (command bound to event)

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by Rich <rich@example.invalid> 2 weeks ago

alexandru <alexandru.dadalau@meshparts.de> wrote:
> Actually yes, I'm sure.
> I have the errorInfo that shows the stack of procedure calls.
> The procedure is called with "decimals" equal to 6.

A very large number in val can also trigger the same error, even with 
decimals at 6:

    $ rlwrap tclsh
    % set decimals 6
    6
    % set val 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    % expr {round($val*(10.0**($decimals+3)))/(10.0**$decimals)}
    integer value too large to represent
    % 

So if you are certian decimals is 6, then a very large number is 
ending up in val somehow.

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by alexandru.dadalau@meshparts.de (alexandru) 2 weeks ago

Ok thanks, I did tried very large values, but I gave up trying to early,
as no error came.

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by Christian Gollwitzer <auriocus@gmx.de> 2 weeks ago

Am 18.09.24 um 12:15 schrieb alexandru:
> Ok thanks, I did tried very large values, but I gave up trying to early,
> as no error came.

You get this for an infinite argumment:

(chris) 69 % expr round(Inf)
integer value too large to represent

	Christian

Click on article to view all threads in comp.lang.tcl
Re: What value can cause this error?
Posted by alexandru.dadalau@meshparts.de (alexandru) 1 week 5 days ago

Thanks Christian!
I'll implement this check.

Click on article to view all threads in comp.lang.tcl