Negate: Difference between revisions
(→Documentation: BQN) |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
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]] <source lang=apl inline>-</ | {{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]] <source 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]] <source lang=apl inline>¯</ | 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]] <source lang=apl inline>¯</syntaxhighlight> for the negative sign, but [[K]] uses the same symbol <source lang=apl inline>-</syntaxhighlight> as Minus, treating a <source lang=apl inline>-</syntaxhighlight> immediately preceding a numeric literal with no spaces as a negative sign. | ||
== Examples == | == Examples == | ||
Line 11: | Line 11: | ||
- 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. | ||
<source lang=apl> | <source 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 <source lang=apl inline>¯128</ | 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 <source lang=apl inline>¯128</syntaxhighlight> to <source lang=apl inline>127</syntaxhighlight> inclusive, so <source 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 == |
Revision as of 21:17, 10 September 2022
- 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.
-
|
Negate (-
), or Minus, is a monadic scalar function which returns the additive inverse of its argument. It shares a glyph <source 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 <source lang=apl inline>¯</syntaxhighlight> for the negative sign, but K uses the same symbol <source lang=apl inline>-</syntaxhighlight> as Minus, treating a <source lang=apl inline>-</syntaxhighlight> immediately preceding a numeric literal with no spaces as a negative sign.
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 elements while Negate can only negate an entire array. <source lang=apl>
- 1 2 3
¯1 ¯2 ¯3 </syntaxhighlight> Negate works on every type of number present, including complex numbers. <source lang=apl>
- ¯2.5 1e20 3j¯4
2.5 ¯1E20 ¯3J4 </syntaxhighlight>
Precision
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 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 <source lang=apl inline>¯128</syntaxhighlight> to <source lang=apl inline>127</syntaxhighlight> inclusive, so <source 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
External links
Documentation
- Dyalog
- APLX
- J Dictionary, NuVoc
- BQN