3 The 1003.2 work has been at a stand-still for ages. Who knows if or
4 when a new revision will actually happen...
8 Although the published 1003.2 standard contained the incorrect
9 comparison rules of 11.2 draft as described below, no actual implementation
10 of awk (that I know of) actually used those rules.
12 A revision of the 1003.2 standard is in progress, and in the May 1995
13 draft, the rules were fixed (based on my submissions for interpretation
14 requests) to match the description given below. Thus, the next version
15 of the standard will have a correct description of the comparison
20 Right now, the numeric vs. string comparisons are screwed up in draft
21 11.2. What prompted me to check it out was the note in gnu.bug.utils
22 which observed that gawk was doing the comparison $1 == "000"
23 numerically. I think that we can agree that intuitively, this should
24 be done as a string comparison. Version 2.13.2 of gawk follows the
25 current POSIX draft. Following is how I (now) think this
28 1. A numeric literal or the result of a numeric operation has the NUMERIC
31 2. A string literal or the result of a string operation has the STRING
34 3. Fields, getline input, FILENAME, ARGV elements, ENVIRON elements and the
35 elements of an array created by split() that are numeric strings
36 have the STRNUM attribute. Otherwise, they have the STRING attribute.
37 Uninitialized variables also have the STRNUM attribute.
39 4. Attributes propagate across assignments, but are not changed by
40 any use. (Although a use may cause the entity to acquire an additional
41 value such that it has both a numeric and string value -- this leaves the
44 When two operands are compared, either string comparison or numeric comparison
45 may be used, depending on the attributes of the operands, according to the
46 following (symmetric) matrix:
48 +----------------------------------------------
49 | STRING NUMERIC STRNUM
50 --------+----------------------------------------------
52 STRING | string string string
54 NUMERIC | string numeric numeric
56 STRNUM | string numeric numeric
57 --------+----------------------------------------------
59 So, the following program should print all OKs.
68 print ++test ": " ( (str == "0e2") ? "OK" : "OOPS" )
69 print ++test ": " ( ("0e2" != 0) ? "OK" : "OOPS" )
70 print ++test ": " ( ("0" != $2) ? "OK" : "OOPS" )
71 print ++test ": " ( ("0e2" == $1) ? "OK" : "OOPS" )
73 print ++test ": " ( (0 == "0") ? "OK" : "OOPS" )
74 print ++test ": " ( (0 == num) ? "OK" : "OOPS" )
75 print ++test ": " ( (0 != $2) ? "OK" : "OOPS" )
76 print ++test ": " ( (0 == $1) ? "OK" : "OOPS" )
78 print ++test ": " ( ($1 != "0") ? "OK" : "OOPS" )
79 print ++test ": " ( ($1 == num) ? "OK" : "OOPS" )
80 print ++test ": " ( ($2 != 0) ? "OK" : "OOPS" )
81 print ++test ": " ( ($2 != $1) ? "OK" : "OOPS" )
82 print ++test ": " ( ($3 == 0) ? "OK" : "OOPS" )
83 print ++test ": " ( ($3 == $1) ? "OK" : "OOPS" )
84 print ++test ": " ( ($2 != $4) ? "OK" : "OOPS" ) # 15
91 print ++test ": " ( (a != b) ? "OK" : "OOPS" ) # 16 and 22
97 print ++test ": " ( (d != b) ? "OK" : "OOPS" )
99 print ++test ": " ( (d + 0 == b) ? "OK" : "OOPS" )
102 print ++test ": " ( (e == b "") ? "OK" : "OOPS" )
105 print ++test ": " ( (a == 2.13) ? "OK" : "OOPS" )
108 print ++test ": " ( (a != 2.13) ? "OK" : "OOPS" )
112 print ++test ": " ( (a == 2.13) ? "OK" : "OOPS" )