Modify ↓
#3869 closed Bug (Fixed)
Subtraction operator before power operation is parsed incorrectly
| Reported by: | AspirinJunkie | Owned by: | Jon |
|---|---|---|---|
| Milestone: | 3.3.16.1 | Component: | AutoIt |
| Version: | 3.3.16.0 | Severity: | None |
| Keywords: | power minus | Cc: |
Description
For the operation of the basic form a - b^e, the result depends on the data type of the base b and the parity of the exponent e.
The following test script:
Global $sString = "" $x = 2 $y = 4 $sString = StringFormat("% 15s = %d\n", "11 - 2 ^ 4", 11 - 2 ^ 4) & _ StringFormat("% 15s = %d\n", "11 - 2.0 ^ 4", 11 - 2.0 ^ 4) & _ StringFormat("% 15s = %d\n", "11 - 2e0 ^ 4", 11 - 2e0 ^ 4) & _ StringFormat("% 15s = %d\n", "11 - '2' ^ 4", 11 - '2' ^ 4) & _ StringFormat("% 15s = %d\n", "11 - $x ^ 4", 11 - $x ^ 4) & _ StringFormat("% 15s = %d\n", "11 - (2 ^ 4)", 11 - (2 ^ 4)) & _ StringFormat("% 15s = %d\n", "11 - - 2 ^ 4", 11 - - 2 ^ 4) & _ StringFormat("% 15s = %d\n\n", "11 - 2 ^ $y", 11 - 2 ^ $y) $y = 3 $sString &= StringFormat("% 15s = %d\n", "11 - 2 ^ 3", 11 - 2 ^ 3) & _ StringFormat("% 15s = %d\n", "11 - 2.0 ^ 3", 11 - 2.0 ^ 3) & _ StringFormat("% 15s = %d\n", "11 - 2e0 ^ 3", 11 - 2e0 ^ 3) & _ StringFormat("% 15s = %d\n", "11 - '2' ^ 3", 11 - '2' ^ 3) & _ StringFormat("% 15s = %d\n", "11 - $x ^ 3", 11 - $x ^ 3) & _ StringFormat("% 15s = %d\n", "11 - (2 ^ 3)", (11 - 2 ^ 3)) & _ StringFormat("% 15s = %d\n", "11 - - 2 ^ 3", 11 - 2 ^ 3) & _ StringFormat("% 15s = %d\n\n", "11 - 2 ^ $y", 11 - 2 ^ $y) ConsoleWrite($sString)
produces under 3.3.16.0:
11 - 2 ^ 4 = 27
11 - 2.0 ^ 4 = 27
11 - 2e0 ^ 4 = 27
11 - '2' ^ 4 = -5
11 - $x ^ 4 = -5
11 - (2 ^ 4) = -5
11 - - 2 ^ 4 = -5
11 - 2 ^ $y = 27
11 - 2 ^ 3 = 3
11 - 2.0 ^ 3 = 3
11 - 2e0 ^ 3 = 3
11 - '2' ^ 3 = 3
11 - $x ^ 3 = 3
11 - (2 ^ 3) = 3
11 - - 2 ^ 3 = 3
11 - 2 ^ $y = 3
and under 3.3.14.5:
11 - 2 ^ 4 = 27 11 - 2.0 ^ 4 = -5 11 - 2e0 ^ 4 = -5 11 - '2' ^ 4 = -5 11 - $x ^ 4 = -5 11 - (2 ^ 4) = -5 11 - - 2 ^ 4 = -5 11 - 2 ^ $y = 27 11 - 2 ^ 3 = 3 11 - 2.0 ^ 3 = 3 11 - 2e0 ^ 3 = 3 11 - '2' ^ 3 = 3 11 - $x ^ 3 = 3 11 - (2 ^ 3) = 3 11 - - 2 ^ 3 = 3 11 - 2 ^ $y = 3
Two possible explanations for this behaviour:
- binary minus is misinterpreted as unary minus:
- The minus has two functions - once as a binary minus operator and once as a unary sign operator.
- The tricky thing about this is that the binary operator has a lower priority than the power operator.
- The sign operator, on the other hand, has a higher priority (in contrast to mathematics) than the power operator.
- This leads to the implicit execution
(-2)^4 - The basic problem here, however, is that even if the minus here is only interpreted as a sign operator, we still lack a binary operator that links the right side with the 11. The parser seems to assume a plus operator for this.
- Furthermore, there is no indication in the AutoIt documentation so far that the sign operator has a higher valence than the power operator.
- the minus is executed twice:
- the
--Operator seem to be executed twice - once as a unary operator (sign) and once as a binary operator (the minus operation). - This leads to the implicit calculation
11 - (-(2^4))
- the
Attachments (0)
Change History (6)
comment:1 by , 4 years ago
comment:2 by , 4 years ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:3 by , 4 years ago
| Milestone: | → 3.3.15.6 |
|---|---|
| Resolution: | → Fixed |
| Status: | assigned → closed |
Fixed by revision [12735] in version: 3.3.15.6
comment:4 by , 4 years ago
| Milestone: | 3.3.15.6 → 3.3.16.1 |
|---|
Fixed by revision [12736] in version: 3.3.16.1
comment:6 by , 3 years ago
Hum, with
ConsoleWrite((11 - 24) & @CRLF)
I'm still getting 27 in v3.3.16.1
It's computing 11 + (-2)4
Note:
See TracTickets
for help on using tickets.

Hi,
the main problem was coming from a regression introduce by #3772
But it was still a pb with 3.3.14.5 which must return -5 all the time
The unary operator is not really handled in AutoIt
The fix has been sent to Jon