summaryrefslogtreecommitdiff
path: root/chapter12/README.md
blob: 36922373be4593aff543dd86f207de30343d0b5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Chapter 12: Floats

[Previous: Chapter 11](../chapter11/README.md) |
[Next: Chapter 13](../chapter13/README.md)

# Table of Contents

1. [Float](#floats)

In this chapter, we add a floating point type and values.

You can also read [this chapter](https://github.com/SeaOfNodes/Simple/tree/linear-chapter12) in a linear Git revision history on the [linear](https://github.com/SeaOfNodes/Simple/tree/linear) branch and [compare](https://github.com/SeaOfNodes/Simple/compare/linear-chapter11...linear-chapter12) it to the previous chapter.

## Floats

Floating point values start with the `flt` type and compute IEEE754 64-bit arithmetic.
Integer expressions auto-widen to floats when involved in a float expression.

```java
flt f = 0.5;
int x = 2;
f = f+x;     // Auto-widen x to 2.0, result is 2.5
f = f+true;  // Since bools are just synonyms for integers 0,1 they auto-widen also
```

There is no corresponding way right now to round a `flt` back to an `int`:
```java
int x = 3.14; // error
```

Here is Newton's method for computing a square root:
```java
flt guess = arg;  // Initial guess is just argument
while( true ) {
    // Next guess from Newton's method
    flt next = (arg/guess + guess)/2;
    // Break if hit fixed point
    if( next == guess ) break;
    guess = next;
}
return guess;
```
When run with argument 2.0, produces 1.414213562373095.

Floating point operations have their own Nodes:

| Node                   | Op                   |
|------------------------|----------------------|
| AddF, SubF, MulF, DivF | Basic binary FP ops  |
| MinusF                 | Unary negate         |
| EQF, LTF, LEF          | FP compare operators |

Within the Type lattice, we add the following domain:

* ![Float](../docs/type-float.svg) - Float values. The same shape as the Integer values, but floats
  with a top (`TOP`, ⊤), bottom (`BOT`, ⊥), and constants.

The other domains retain Chapter 10b's named structs, nullable pointers, and
precise memory aliases.

![Graph1](./docs/lattice.svg)