System Function DR: Difference between revisions

From NARS2000
Jump to navigationJump to search
Line 225: Line 225:
</apll>
</apll>
<br/><br/>
<br/><br/>
{quad}DR is a ''[[monadic]]'' system function, which means you cannot assign a value to it.
{quad}DR is available in ''[[monadic]]'' and '''[[dyadic]]'' forms, and is a system function, which means you cannot assign a value to it.
{{System Variables}}
{{System Variables}}

Revision as of 22:05, 27 February 2013

Monadic Function

Z←⎕DR R returns the data representation of R.
R is an arbitrary array.
Z is a numeric scalar which represents the datatype of R.


The datatypes are encoded with a unique index in the low-order two digits, and (where appropriate) the bits per element in the higher-order digits:

  •  110: Boolean, one bit per element
  • 1611: Character, 16 bits per element
  • 6412: Integer, 64 bits per element
  • 6413: Floating Point, 64 bits per element (double precision)
  •   14: Rational, 16 bytes plus two 4- or 8-byte pointers plus size of limbs per element
  •   15: Variable-precision Floating Point, 12 bytes plus one 4- or 8-byte pointer plus size of limbs per element
  •   19: Arithmetic Progression Array, 64 bits each for the offset and multiplier
  •   20: Heterogeneous, one 4- or 8-byte pointer per element
  •   21: Nested, one 4- or 8-byte pointer per element

For example,

      ⎕DR 1 0 1
110
      ⎕DR ⌈/⍬
6413
      ⎕DR 2 64⍴1
— Note this is really an APA, not Boolean
19
      ⎕DR 2 64⍴1 1
— This one is Boolean because Reshape produces APAs for integer singleton right arguments only
110


Dyadic Function

Z←L ⎕DR R converts R to the datatype indicated by L.
R is an arbitrary array.
L is an integer scalar or one-element vector datatype (see the table above), or a special value (see below).
Z is R where each of the values are converted to the datatype indicated by L.


If the conversion is from a narrower datatype to a wider datatype, there must be exactly enough columns in the right argument to match a multiple of the size of the wider datatype. For example, when converting from character (16-bit) to integer (64-bit), the last column of the right argument must be a multiple of 4 (= 64/16); otherwise, a LENGTH ERROR is signalled.

      6412 ⎕DR 'NARS2000' — Eight 16-bit characters (=128 bits) convert to two 64-bit integers
23362775258562638 13511005043687474

If the conversion is from a wider datatype to a narrower datatype, the number of values in the result is a multiple of the ratio of the wider datatype to the narrower datatype. For example, when converting from integer (64-bit) to character (16-bit), the last column in the result is the product of last column of the right argument and 4 (= 64/16).

For example,

      ⍴⎕←1611 ⎕DR 23362775258562638 13511005043687474
NARS2000
8

Keep in mind how Arithmetic Progression Arrays are created and represented as they can fool you. For example, you might try the following to convert from Boolean to integer:

      6412 ⎕DR 2 64⍴1
1 0 2 64

However, this doesn't produce the expected result because this particular right argument is an APA, not a Boolean vector. That is, under certain circumstances, the reshape primitive creates an APA. In this case, the APA is an array with an offset of 1, a multiplier of 0 and a shape of 2 64.

On the other hand, this expression

      6412 ⎕DR 2 64⍴1 1
 ¯1
 ¯1

produces the expected result because the right argument is now Boolean.

Special Values

There are several special values you may use as a left argument to ⎕DR:

  • The value 0 displays the datatype of the right argument as a text string so you don't need to remember the datatype numbers.

    For example,

          ⎕DR 'a'
    1611
          0 ⎕DR 'a'
    Character (1611): 16 bits per element
          0 ⎕DR ⍳12
    Arithmetic Progression Array (19): 64 bit offset + 64 bit multiplier -- PV1

    Some arrays have properties that may be displayed by this function:

    PV0 This array is a Permutation Vector, origin-0
    PV1 This array is a Permutation Vector, origin-1
    All2s This array consists of all 2s
    FPCnnn This array is a VFP and all entries are represented in Precision nnn
    FPC-Mixed This array is a VFP whose entries are represented in two or more different precisions
  • The value 1 converts between character and floating point. This argument makes it easy to see the representation of floating point numbers in order to help understand precision and other floating point issues.

    For example,

          ⎕PP←99
          1 ⎕DR 1.1
    3FF199999999999A
          1 ⎕DR '3fd',13⍴'5'
    0.3333333333333333
          1 ⎕DR ¯∞ ∞
    FFF0000000000000
    7FF0000000000000
          1 ⎕DR '7fe',13⍴'f'
    — The largest positive number
    1.7976931348623157E308
          1 ⎕DR '001',13⍴'0'
    — The smallest positive number
    2.2250738585072014E¯308
          1 ⎕DR '801',13⍴'0'
    — The largest negative number
    ¯2.2250738585072014E¯308
          1 ⎕DR 'ffe',13⍴'f'
    — The smallest negative number
    ¯1.7976931348623157E308

  • The value 2 converts between character and 64-bit integer. This argument makes it easy to see the representation of integers.

    For example,

          2 ⎕DR ¯1
    FFFFFFFFFFFFFFFF
          2 ⎕DR '7',15⍴'f'
    — The largest positive integer
    9223372036854775807
          2 ⎕DR '8',15⍴'0'
    — The smallest negative integer
    ¯9223372036854775808
          2 ⎕DR 9223372036854775807 ¯9223372036854775808
    7FFFFFFFFFFFFFFF
    8000000000000000

A Word of Caution

This system function allows you to create special numbers we don't support in that no other primitive generates these numbers and the behavior of all other primitives on these numbers is undefined. Examples of such special numbers include Quiet NaNs, Signaling NaNs, Negative Zero, and Denormals. If the system doesn't behave as you expect when using these special numbers, don't be surprised.

For example,

      ⎕CT←0 ⋄ ⎕PP←99
      6413 ⎕DR ¯64↑1
¯0
      QNaN←6413 ⎕DR ¯64↑13⍴1
— A Quiet NaN (Not a Number)
      1 ⎕DR QNaN
FFF8000000000000
      QNaN=QNaN
0
      1 ⎕DR '000fffffffffffff'
— The largest positive denormal
2.225073858507201E¯308
      1 ⎕DR '0000000000000001'
— The smallest positive denormal
5E¯324


⎕DR is available in monadic and 'dyadic forms, and is a system function, which means you cannot assign a value to it.

System Variables (A value may be assigned to these except for ⎕DM)
ALX CT DM DT ELX FC FEATURE FPC IC IO
LR LX PP PR PW RL SA WSID
Niladic System Functions (a value cannot be assigned to these)
A AV EM ET LC NNAMES NNUMS SI SYSID SYSVER
T TC TCBEL TCBS TCESC TCFF TCHT TCLF TCNL TCNUL
TS WA
Monadic or dyadic system functions (a value cannot be assigned to these)
AT CR DC DFT DL DR EA EC ERROR ES
EX FMT FX MF NAPPEND NC NCREATE NERASE NINFO NL
NLOCK NREAD NRENAME NREPLACE NRESIZE NSIZE NTIE NUNTIE STOP TF
TRACE UCS VR
Note that quad functions and variables (except for the ⎕A family of functions) are case insensitive