4,500
edits
(→Documentation: BQN) |
m (Text replacement - "<source" to "<syntaxhighlight") |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
:''This page describes the monadic arithmetic function. For logical negation of a single argument, see [[Not]]. For dyadic subtraction (minus), see [[Subtract]]. For the negative sign of a number, see [[High minus]].'' | :''This page describes the monadic arithmetic function. For logical negation of a single argument, see [[Not]]. For dyadic subtraction (minus), see [[Subtract]]. For the negative sign of a number, see [[High minus]].'' | ||
{{Built-in|Negate|-}}, or '''Minus''', is a [[monadic]] [[scalar function]] which returns the [[wikipedia:additive inverse|additive inverse]] of its argument. It shares a [[glyph]] < | {{Built-in|Negate|-}}, or '''Minus''', is a [[monadic]] [[scalar function]] which returns the [[wikipedia:additive inverse|additive inverse]] of its argument. It shares a [[glyph]] <syntaxhighlight lang=apl inline>-</syntaxhighlight> with [[Subtract]], which may also be called Minus, and may be considered a case of Subtract with a default left argument of zero. | ||
The [[function]] Negate is distinguished from the syntactic [[negative]] sign, which is not a function but rather part of [[numeric literal]] notation. APL uses the [[high minus]] < | The [[function]] Negate is distinguished from the syntactic [[negative]] sign, which is not a function but rather part of [[numeric literal]] notation. APL uses the [[high minus]] <syntaxhighlight lang=apl inline>¯</syntaxhighlight> for the negative sign, but [[K]] uses the same symbol <syntaxhighlight lang=apl inline>-</syntaxhighlight> as Minus, treating a <syntaxhighlight lang=apl inline>-</syntaxhighlight> immediately preceding a numeric literal with no spaces as a negative sign. | ||
== Examples == | == Examples == | ||
Negating a vector of positive numbers. Note that the result array is displayed with a [[high minus]] on each element rather than a single Negate. The high minus applies to individual [[element]]s while Negate can only negate an entire array. | Negating a vector of positive numbers. Note that the result array is displayed with a [[high minus]] on each element rather than a single Negate. The high minus applies to individual [[element]]s while Negate can only negate an entire array. | ||
< | <syntaxhighlight lang=apl> | ||
- 1 2 3 | - 1 2 3 | ||
¯1 ¯2 ¯3 | ¯1 ¯2 ¯3 | ||
</ | </syntaxhighlight> | ||
Negate works on every type of number present, including [[complex number]]s. | Negate works on every type of number present, including [[complex number]]s. | ||
< | <syntaxhighlight lang=apl> | ||
- ¯2.5 1e20 3j¯4 | - ¯2.5 1e20 3j¯4 | ||
2.5 ¯1E20 ¯3J4 | 2.5 ¯1E20 ¯3J4 | ||
</ | </syntaxhighlight> | ||
== Precision == | == Precision == | ||
Line 22: | Line 22: | ||
Unlike [[Subtract]], Negate cannot lose precision in floating-point calculations. This is because floating-point representations have a sign bit indicating whether a value is positive or negative; negating a number only changes the sign bit. Floating-point formats always use a sign bit because they distribute numbers exponentially. But only positive numbers can be represented as the result of an exponent, so an additional sign bit is needed. | Unlike [[Subtract]], Negate cannot lose precision in floating-point calculations. This is because floating-point representations have a sign bit indicating whether a value is positive or negative; negating a number only changes the sign bit. Floating-point formats always use a sign bit because they distribute numbers exponentially. But only positive numbers can be represented as the result of an exponent, so an additional sign bit is needed. | ||
For integers, which are always stored in [[wikipedia:two's complement|two's complement]] format on modern computers, Negate forces a conversion to a higher type when passed the smallest possible value: for example, the range of 1-byte integers is from < | For integers, which are always stored in [[wikipedia:two's complement|two's complement]] format on modern computers, Negate forces a conversion to a higher type when passed the smallest possible value: for example, the range of 1-byte integers is from <syntaxhighlight lang=apl inline>¯128</syntaxhighlight> to <syntaxhighlight lang=apl inline>127</syntaxhighlight> inclusive, so <syntaxhighlight lang=apl inline>-¯128</syntaxhighlight> requires a 2-byte integer to store. Similarly, negating a [[Boolean]] array (that is, 1-bit unsigned values) forces it to be converted to an integer array. These conversions cannot cause a loss of precision in any normal APL because the result is a power of two, and is exactly representable in floating-point format. In [[K]], which wraps on integer overflow, there is also no possibility of such a loss of precision because the minimum 4-byte integer is used as a null value, making the integer range symmetric. | ||
== See also == | == See also == |