Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
go
Commits
72970871
Commit
72970871
authored
Mar 04, 2010
by
Rob Pike
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Spec for complex numbers
R=rsc, ken2, gri, iant CC=cw, golang-dev
https://golang.org/cl/227041
parent
45d51f35
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
153 additions
and
35 deletions
+153
-35
doc/go_spec.html
doc/go_spec.html
+153
-35
No files found.
doc/go_spec.html
View file @
72970871
...
...
@@ -4,6 +4,8 @@
Todo
[ ] clarify: two equal lowercase identifiers from different packages denote different objects
[ ] need language about function/method calls and parameter passing rules
[ ] last paragraph of #Assignments (constant promotion) should be elsewhere
and mention assignment to empty interface.
[ ] need to say something about "scope" of selectors?
[ ] clarify what a field name is in struct declarations
(struct{T} vs struct {T T} vs struct {t T})
...
...
@@ -301,6 +303,8 @@ exponent = ( "e" | "E" ) [ "+" | "-" ] decimals .
<pre>
0.
72.40
072.40 // == 72.40
2.71828
1.e+0
6.67428e-11
...
...
@@ -309,6 +313,31 @@ exponent = ( "e" | "E" ) [ "+" | "-" ] decimals .
.12345E+5
</pre>
<h3
id=
"Imaginary_literals"
>
Imaginary literals
</h3>
<p>
An imaginary literal is a decimal representation of the imaginary part of a
<a
href=
"#Constants"
>
complex constant
</a>
.
It consists of a
<a
href=
"#Floating-point_literals"
>
floating-point literal
</a>
or decimal integer followed
by the lower-case letter
<code>
i
</code>
.
</p>
<pre
class=
"ebnf"
>
imaginary_lit = (decimals | float_lit) "i" .
</pre>
<pre>
0i
011i // == 11i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
</pre>
<h3
id=
"Character_literals"
>
Character literals
</h3>
...
...
@@ -465,8 +494,10 @@ literal.
<h2
id=
"Constants"
>
Constants
</h2>
<p>
There are
<i>
boolean constants
</i>
,
<i>
integer constants
</i>
,
<i>
floating-point constants
</i>
,
and
<i>
string constants
</i>
. Integer and floating-point constants are
<p>
There are
<i>
boolean constants
</i>
,
<i>
integer constants
</i>
,
<i>
floating-point constants
</i>
,
<i>
complex constants
</i>
,
and
<i>
string constants
</i>
. Integer, floating-point,
and complex constants are
collectively called
<i>
numeric constants
</i>
.
</p>
...
...
@@ -474,18 +505,27 @@ collectively called <i>numeric constants</i>.
A constant value is represented by an
<a
href=
"#Integer_literals"
>
integer
</a>
,
<a
href=
"#Floating-point_literals"
>
floating-point
</a>
,
<a
href=
"#Imaginary_literals"
>
imaginary
</a>
,
<a
href=
"#Character_literals"
>
character
</a>
, or
<a
href=
"#String_literals"
>
string
</a>
literal,
an identifier denoting a constant,
a
<a
href=
"#Constant_expressions"
>
constant expression
</a>
, or
the result value of some built-in functions such as
<code>
unsafe.Sizeof
</code>
and
<code>
cap
</code>
or
<code>
len
</code>
applied to an array,
or
<code>
len
</code>
applied to a string constant.
<code>
len
</code>
applied to a string constant,
<code>
real
</code>
and
<code>
imag
</code>
applied to a complex constant
and
<code>
cmplx
</code>
applied to numeric constants.
The boolean truth values are represented by the predeclared constants
<code>
true
</code>
and
<code>
false
</code>
. The predeclared identifier
<a
href=
"#Iota"
>
iota
</a>
denotes an integer constant.
</p>
<p>
In general, complex constants are a form of
<a
href=
"#Constant_expressions"
>
constant expression
</a>
and are discussed in that section.
</p>
<p>
Numeric constants represent values of arbitrary precision and do not overflow.
</p>
...
...
@@ -590,18 +630,21 @@ The predeclared architecture-independent numeric types are:
</p>
<pre
class=
"grammar"
>
uint8 the set of all unsigned 8-bit integers (0 to 255)
uint16 the set of all unsigned 16-bit integers (0 to 65535)
uint32 the set of all unsigned 32-bit integers (0 to 4294967295)
uint64 the set of all unsigned 64-bit integers (0 to 18446744073709551615)
uint8 the set of all unsigned 8-bit integers (0 to 255)
uint16 the set of all unsigned 16-bit integers (0 to 65535)
uint32 the set of all unsigned 32-bit integers (0 to 4294967295)
uint64 the set of all unsigned 64-bit integers (0 to 18446744073709551615)
int8 the set of all signed 8-bit integers (-128 to 127)
int16 the set of all signed 16-bit integers (-32768 to 32767)
int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
int8 the set of all signed 8-bit integers (-128 to 127)
int16 the set of all signed 16-bit integers (-32768 to 32767)
int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
float32 the set of all IEEE-754 32-bit floating-point numbers
float64 the set of all IEEE-754 64-bit floating-point numbers
float32 the set of all IEEE-754 32-bit floating-point number
s
float64 the set of all IEEE-754 64-bit floating-point number
s
complex64 the set of all complex numbers with float32 real and imaginary part
s
complex128 the set of all complex numbers with float64 real and imaginary part
s
byte familiar alias for uint8
</pre>
...
...
@@ -619,6 +662,7 @@ There is also a set of predeclared numeric types with implementation-specific si
uint either 32 or 64 bits
int either 32 or 64 bits
float either 32 or 64 bits
complex real and imaginary parts have type float
uintptr an unsigned integer large enough to store the uninterpreted bits of a pointer value
</pre>
...
...
@@ -1502,7 +1546,8 @@ Zero value:
nil
Functions:
cap close closed copy len make new panic panicln print println
cap close closed cmplx copy imag len make
new panic panicln print println real
</pre>
...
...
@@ -1938,7 +1983,7 @@ Operands denote the elementary values in an expression.
<pre
class=
"ebnf"
>
Operand = Literal | QualifiedIdent | MethodExpr | "(" Expression ")" .
Literal = BasicLit | CompositeLit | FunctionLit .
BasicLit = int_lit | float_lit | char_lit | string_lit .
BasicLit = int_lit | float_lit |
imaginary_lit |
char_lit | string_lit .
</pre>
...
...
@@ -2771,16 +2816,16 @@ x == y+1 && <-chan_ptr > 0
<p>
Arithmetic operators apply to numeric values and yield a result of the same
type as the first operand. The four standard arithmetic operators (
<code>
+
</code>
,
<code>
-
</code>
,
<code>
*
</code>
,
<code>
/
</code>
) apply to integer
and
floating-point types;
<code>
+
</code>
also applies
<code>
-
</code>
,
<code>
*
</code>
,
<code>
/
</code>
) apply to integer
,
floating-point
, and complex
types;
<code>
+
</code>
also applies
to strings. All other arithmetic operators apply to integers only.
</p>
<pre
class=
"grammar"
>
+ sum integers, floats, strings
- difference integers, floats
* product integers, floats
/ quotient integers, floats
+ sum integers, floats,
complex values,
strings
- difference integers, floats
, complex values
* product integers, floats
, complex values
/ quotient integers, floats
, complex values
% remainder integers
&
bitwise and integers
...
...
@@ -2894,9 +2939,10 @@ not occur. For instance, it may not assume that <code>x < x + 1</code> is alw
<p>
Comparison operators yield a value of type
<code>
bool
</code>
.
The operators
<code>
==
</code>
and
<code>
!=
</code>
apply
, at least in some cases,
The operators
<code>
==
</code>
and
<code>
!=
</code>
apply
to operands of all types except arrays and structs.
All other comparison operators apply only to numeric and string values.
All other comparison operators apply only to integer, floating-point
and string values.
</p>
<pre
class=
"grammar"
>
...
...
@@ -3208,15 +3254,19 @@ For example, if <code>x := uint16(0x10F0)</code>, then <code>uint32(int8(x)) ==
The conversion always yields a valid value; there is no indication of overflow.
</p>
<h4>
Conversions involving floating point types
</h4>
<h4>
Conversions involving floating point
and complex
types
</h4>
<ol>
<li>
When converting a floating-point number to an integer, the fraction is discarded
(truncation towards zero).
</li>
<li>
When converting a number to a floating-point type, the result value is rounded
to the precision specified by the floating point type.
A value of complex type may be converted to a different complex type,
but there is no conversion between complex and any other type.
<li>
When converting a number to a floating-point or complex type,
the result value is rounded
to the precision specified by the destination type.
For instance, the value of a variable
<code>
x
</code>
of type
<code>
float32
</code>
may be stored using additional precision beyond that of an IEEE-754 32-bit number,
but float32(x) represents the result of rounding
<code>
x
</code>
's value to
...
...
@@ -3226,8 +3276,9 @@ of precision, <code>but float32(x + 0.1)</code> does not.
</ol>
<p>
In all conversions involving floating-point values, if the result type cannot
represent the value the conversion succeeds but the result value is
In all conversions involving floating-point or complex values,
if the result type cannot represent the value the conversion
succeeds but the result value is
implementation-dependent.
</p>
...
...
@@ -3310,16 +3361,39 @@ respectively. Except for shift operations, if the operands of a binary operation
are an untyped integer constant and an untyped floating-point constant,
the integer constant is converted to an untyped floating-point constant
(relevant for
<code>
/
</code>
and
<code>
%
</code>
).
Similarly,
untyped integer or floating-point constants may be used as operands
wherever it is legal to use an operand of complex type;
the integer or floating point constant is converted to a
complex constant with a zero imaginary part.
</p>
<p>
Applying an operator to untyped constants results in an untyped
constant of the same kind (that is, a boolean, integer, floating-point,
or
string constant), except for
<a
href=
"#Comparison_operators"
>
comparison operators
</a>
which result in
constant of the same kind (that is, a boolean, integer, floating-point,
complex, or
string constant), except for
<a
href=
"#Comparison_operators"
>
comparison operators
</a>
,
which result in
a constant of type
<code>
bool
</code>
.
</p>
<p>
Imaginary literals are untyped complex constants (with zero real part)
and may be combined in binary
operations with untyped integer and floating-point constants; the
result is an untyped complex constant.
Complex constants are always constructed from
constant expressions involving imaginary
literals or constants derived from them, or calls of the
<a
href=
"#Built-in_functions"
>
built-in function
</a>
<code>
cmplx
</code>
.
</p>
<pre>
const Σ = 1 - 0.707i
const Δ = Σ + 2.0e-4 - 1/i
const Φ = iota * 1i
const iΓ = cmplx(0, Γ)
</pre>
<p>
Constant expressions are always evaluated exactly; intermediate values and the
constants themselves may require precision significantly larger than supported
...
...
@@ -3567,9 +3641,10 @@ In assignments, each value must be
<a
href=
"#Assignment_compatibility"
>
assignment compatible
</a>
with the type of the
operand to which it is assigned. If an untyped
<a
href=
"#Constants"
>
constant
</a>
is assigned to a variable of interface type, the constant is
<a
href=
"#Conversions"
>
converted
</a>
to type
<code>
bool
</code>
,
<code>
int
</code>
,
<code>
float
</code>
, or
<code>
string
</code>
to type
<code>
bool
</code>
,
<code>
int
</code>
,
<code>
float
</code>
,
<code>
complex
</code>
or
<code>
string
</code>
respectively, depending on whether the value is a boolean, integer, floating-point,
or string constant.
complex,
or string constant.
</p>
...
...
@@ -4219,7 +4294,7 @@ for i := 0; i <= 3; i++ {
<h2
id=
"Built-in_functions"
>
Built-in functions
</h2>
<p>
A small number of b
uilt-in functions are
B
uilt-in functions are
<a
href=
"#Predeclared_identifiers"
>
predeclared
</a>
.
They are called like any other function but some of them
accept a type instead of an expression as the first argument.
...
...
@@ -4378,6 +4453,49 @@ n1 := copy(s, &a) // n1 == 6, s == []int{0, 1, 2, 3, 4, 5}
n2 := copy(s, s[2:]) // n2 == 4, s == []int{2, 3, 4, 5, 4, 5}
</pre>
<h3
id=
"Complex_numbers"
>
Assembling and disassembling complex numbers
</h3>
<p>
Three functions assemble and disassemble complex numbers.
The built-in function
<code>
cmplx
</code>
constructs a complex
value from a floating-point real and imaginary part, while
<code>
real
</code>
and
<code>
imag
</code>
extract the real and imaginary parts of a complex value.
</p>
<pre
class=
"grammar"
>
cmplx(realPart, imaginaryPart floatT) complexT
real(complexT) floatT
imag(complexT) floatT
</pre>
<p>
The type of the arguments and return value correspond.
For
<code>
cmplx
</code>
, the two arguments must be of the same
floating-point type and the return type is the complex type
with the corresponding floating-point constituents:
<code>
complex
</code>
for
<code>
float
</code>
,
<code>
complex64
</code>
for
<code>
float32
</code>
,
<code>
complex128
</code>
for
<code>
float64
</code>
.
The
<code>
real
</code>
and
<code>
imag
</code>
functions
together form the inverse, so for a complex value
<code>
z
</code>
,
<code>
z
</code>
<code>
==
</code>
<code>
cmplx(real(z),
</code>
<code>
imag(z))
</code>
.
</p>
<p>
If the operands of these functions are all constants, the return
value is a constant.
</p>
<pre>
var a = cmplx(2, -2) // has type complex
var b = cmplx(1.0, -1.4) // has type complex
x := float32(math.Cos(math.Pi/2))
var c64 = cmplx(5, -x) // has type complex64
var im = imag(b) // has type float
var rl = real(c64) // type float32
</pre>
<h3
id=
"Bootstrapping"
>
Bootstrapping
</h3>
...
...
@@ -4808,6 +4926,6 @@ The following minimal alignment properties are guaranteed:
<ul>
<li><span
class=
"alert"
>
Implementation does not honor the restriction on goto statements and targets (no intervening declarations).
</span></li>
<li><span
class=
"alert"
>
Method expressions are not implemented.
</span></li>
<li><span
class=
"alert"
>
Conversions from strings to
<code>
[]int
</code>
and
<code>
[]byte
</code>
are not implemented.
.
</span></li>
<li><span
class=
"alert"
>
The implementation of complex numbers is incomplete
.
</span></li>
<li><span
class=
"alert"
>
Gccgo allows only one init() function per source file.
</span></li>
</ul>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment