• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. SKILL arithmetic comparisons

Stats

  • Locked Locked
  • Replies 3
  • Subscribers 143
  • Views 15756
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

SKILL arithmetic comparisons

sri125
sri125 over 15 years ago

 SKILL is notorious for the way it stores numbers in memory. e.g variable w, which

should be 0.4 gets stored as 0.3999999999999 or something like that.

 

So when you use it in 'if-else' loop like:

if( w == 0.4 then 

    block good;

else

   block bad;

 )

 

You will end up in block bad unless you do something like

 

abs( w - 0.4 ) < 0.000001 

or something like above.

 

Is there an elegant way to handle this in SKILL ?

 

thanks

 

 

 

  • Cancel
  • skillUser
    skillUser over 15 years ago

    There is nothing "notorious" or special with the way that SKILL stores floating point numbers compared to other programming languages.  A floating point number is typically stored in an IEEE (754) format which is comprised of a sign, an exponent and a mantissa (or significand).  Most decimal numbers do not have an exact representation in the binary floating-point storage format used in single-precision and double-precision data types.  So in order to be able to test for equality in a reliable fashion, the best thing is to subtract one number from the other and test the remainder against a small number, exactly as you have shown.  The small number could be a fraction of the input number so that the test works equally well for large values and smaller values.

    Sorry, that's just how things are for floating point number comparison, I'm not sure if there is any better way?

    Regards,

    Lawrence.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    As Lawrence says, you get exactly the same kind of rounding errors in C and all languages using IEEE floating point numbers. In fact whenever this comes up with someone saying this is a bug in SKILL, I show a C program with the same behaviour.

    The trick is to write a function to do floating point "equality" checks. If you know the magnitude of the numbers, you can use a fixed size "epsilon" as in your example.

    Or you can do something like:

    procedure(myCompare(a b @key (reltol 1e-6) (abstol 1e-12))
    let((tol)
    tol=reltol*max(abs(a) abs(b))+abstol
    abs(a-b) < tol
    )
    )

    This has both a relative and absolute tolerance in the comparison.

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • sri125
    sri125 over 15 years ago

     Thanks Lawresce and Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information