From: daniel@...42.com Date: 2020-03-12T18:04:43+00:00 Subject: [ruby-core:97462] [Ruby master Bug#16677] Negative integer powered (**) to a float number results in a complex Issue #16677 has been updated by Dan0042 (Daniel DeLorme). In math exponentation is expressed as superscript; there's no exponentation "operator" per se, afaik. So `-2�` is `-(2�)` according to mathematical rules, and it feels quite obvious to me. It doesn't feel quite as right when written with an operator though; `-2**2` doesn't have that same obviousness, and `-2 ** 2` is downright deceptive. But a quick search in gems shows things like `Time.at(-2**63)` where it's clearly intended as `-(2**63)`. I think those precedence rules are ok, especially given that most languages work the same way (see table below). But in that case `-2.to_i ** 2` should obey expected rules and parse as `-(2.to_i ** 2)`. Although a quick search in gems shows a few things like `-28.upto(28)` or `-5.hash` that would break (mostly in tests/specs). For reference, here's some other languages' precedence rules for exponentation and unary operators: (from high to low precedence) | language | | exp. | | | note | |--------------|---------|------|-----------|-----|------------------------------| | Ruby | ! ~ + | ** | - | | quite unique... | | Perl | | ** | ! ~ \ + - | | | | Python | | ** | ~ | + - | | | Javascript | ! ~ + - | ** | | | but `-2**2` is a SyntaxError | | Excel, Basic | + - | ^ | | | | | F# | + - | ** | | | | | Lua | | ^ | - | | | | R | | ^ | + - | | | I kinda like how Javascript does it; just force people to use parentheses! :-) ---------------------------------------- Bug #16677: Negative integer powered (**) to a float number results in a complex https://bugs.ruby-lang.org/issues/16677#change-84606 * Author: CamilleDrapier (Camille Drapier) * Status: Open * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * ruby -v: 2.5.7, 2.6.5, 2.7.0 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- Not sure if this is an unexpected behavior. This works as I expect: ``` -2 ** 2.2 # => -4.59479341998814 ``` But when I change the code a bit, it gives me a complex: ```ruby -2.to_i ** 2.2 # => (3.717265962412589+2.7007518095995273i) a = -2; a ** 2.2 # => (3.717265962412589+2.7007518095995273i) ``` This seems to happen only with negative numbers and float powers. I think it might be related to how `Fixnum` is treated differently from other classes by the power function. -- https://bugs.ruby-lang.org/ Unsubscribe: