• 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 15781
  • 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
Parents
  • 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
Reply
  • 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
Children
No Data

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