Catastrophic cancellation: the pitfalls of floating point arithmetic (and how to avoid them!) Graham Markall Quantitative Developer, OpenGamma

Similar documents
NAN propagation versus fault trapping in floating point code

FP_IEEE_DENORM_GET_ Procedure

Numerical computing. How computers store real numbers and the problems that result

UNIVERSITY OF MASSACHUSETTS Dept. of Electrical & Computer Engineering. Digital Computer Arithmetic ECE 666

Floating Point. CSE 351 Autumn Instructor: Justin Hsia

Floating Point. CSE 351 Autumn Instructor: Justin Hsia

Matthieu Lefebvre Princeton University. Monday, 10 July First Computational and Data Science school for HEP (CoDaS-HEP)

Floating Point Numbers

Floating Point Numbers

Data Representation Floating Point

Data Representation Floating Point

Floating Point January 24, 2008

Foundations of Computer Systems

Floating Point Puzzles The course that gives CMU its Zip! Floating Point Jan 22, IEEE Floating Point. Fractional Binary Numbers.

What Every Programmer Should Know About Floating-Point Arithmetic

FLOATING POINT NUMBERS

Systems I. Floating Point. Topics IEEE Floating Point Standard Rounding Floating Point Operations Mathematical properties

Floating Point. CSE 351 Autumn Instructor: Justin Hsia

Floating point. Today! IEEE Floating Point Standard! Rounding! Floating Point Operations! Mathematical properties. Next time. !

Representing and Manipulating Floating Points

Chapter 2 Float Point Arithmetic. Real Numbers in Decimal Notation. Real Numbers in Decimal Notation

Floating-point representations

Floating Point Puzzles. Lecture 3B Floating Point. IEEE Floating Point. Fractional Binary Numbers. Topics. IEEE Standard 754

Floating-point representations

Representing and Manipulating Floating Points

Representing and Manipulating Floating Points. Computer Systems Laboratory Sungkyunkwan University

Basics of Computation. PHY 604:Computational Methods in Physics and Astrophysics II

System Programming CISC 360. Floating Point September 16, 2008

CSCI 402: Computer Architectures. Arithmetic for Computers (3) Fengguang Song Department of Computer & Information Science IUPUI.

Representing and Manipulating Floating Points

Floating Point Puzzles. Lecture 3B Floating Point. IEEE Floating Point. Fractional Binary Numbers. Topics. IEEE Standard 754

MATH 353 Engineering mathematics III

Representing and Manipulating Floating Points. Jo, Heeseung

Computer arithmetics: integers, binary floating-point, and decimal floating-point

Giving credit where credit is due

Giving credit where credit is due

GPU Floating Point Features

Chapter 3. Errors and numerical stability

Computer arithmetics: integers, binary floating-point, and decimal floating-point

Floating Point Numbers

1.2 Round-off Errors and Computer Arithmetic

High Performance Computing - Floating Point Numbers. Prof Matt Probert

Chapter 4. Operations on Data

Lesson #3. Variables, Operators, and Expressions. 3. Variables, Operators and Expressions - Copyright Denis Hamelin - Ryerson University

Floating Point Representation. CS Summer 2008 Jonathan Kaldor

CS 261 Fall Floating-Point Numbers. Mike Lam, Professor.

Floating Point Numbers

Computer Architecture and IC Design Lab. Chapter 3 Part 2 Arithmetic for Computers Floating Point

Floating Point (with contributions from Dr. Bin Ren, William & Mary Computer Science)

Computer Arithmetic Ch 8

Computer Arithmetic Ch 8

CS 261 Fall Floating-Point Numbers. Mike Lam, Professor.

Floating Point. CSE 238/2038/2138: Systems Programming. Instructor: Fatma CORUT ERGİN. Slides adapted from Bryant & O Hallaron s slides

Finite arithmetic and error analysis

Floating Point : Introduction to Computer Systems 4 th Lecture, May 25, Instructor: Brian Railing. Carnegie Mellon

Floating-point representation

2 Computation with Floating-Point Numbers

Computer Organization: A Programmer's Perspective

Floating point. Today. IEEE Floating Point Standard Rounding Floating Point Operations Mathematical properties Next time.

IEEE 754 Floating-Point Format

Systems Programming and Computer Architecture ( )

3.5 Floating Point: Overview

Classes of Real Numbers 1/2. The Real Line

COMP2611: Computer Organization. Data Representation

Operations On Data CHAPTER 4. (Solutions to Odd-Numbered Problems) Review Questions

EE878 Special Topics in VLSI. Computer Arithmetic for Digital Signal Processing

Written Homework 3. Floating-Point Example (1/2)

Computer Systems C S Cynthia Lee

ieee arithmetic: IEEE Arithmetic Facilities Module March 9, 2009

CS429: Computer Organization and Architecture

Roundoff Errors and Computer Arithmetic

UNIVERSITY OF MASSACHUSETTS Dept. of Electrical & Computer Engineering. Digital Computer Arithmetic ECE 666

18-642: Floating Point Blues

IEEE Standard 754 Floating Point Numbers

Lecture 10. Floating point arithmetic GPUs in perspective

Bryant and O Hallaron, Computer Systems: A Programmer s Perspective, Third Edition. Carnegie Mellon

Up next. Midterm. Today s lecture. To follow

2 Computation with Floating-Point Numbers

CS 265. Computer Architecture. Wei Lu, Ph.D., P.Eng.

Data Representation Floating Point

The course that gives CMU its Zip! Floating Point Arithmetic Feb 17, 2000

Floating Point Arithmetic. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

ECE232: Hardware Organization and Design

Internal representation. Bitwise operators

MAT128A: Numerical Analysis Lecture Two: Finite Precision Arithmetic

Inf2C - Computer Systems Lecture 2 Data Representation

Compiler Options. Linux/x86 Performance Practical,

VTU NOTES QUESTION PAPERS NEWS RESULTS FORUMS Arithmetic (a) The four possible cases Carry (b) Truth table x y

Numerical Methods 5633

Lecture 17 Floating point

Today CISC124. Building Modular Code. Designing Methods. Designing Methods, Cont. Designing Methods, Cont. Assignment 1 due this Friday, 7pm.

Floating-Point Arithmetic

Chapter 3: Arithmetic for Computers

Most nonzero floating-point numbers are normalized. This means they can be expressed as. x = ±(1 + f) 2 e. 0 f < 1

4 Operations On Data 4.1. Foundations of Computer Science Cengage Learning

Floating-point Arithmetic. where you sum up the integer to the left of the decimal point and the fraction to the right.

Objectives. look at floating point representation in its basic form expose errors of a different form: rounding error highlight IEEE-754 standard

Computer System and programming in C

Internal representation. Bitwise operators

CSCI 402: Computer Architectures

Transcription:

Catastrophic cancellation: the pitfalls of floating point arithmetic (and how to avoid them!) Graham Markall Quantitative Developer, OpenGamma

Intro/Disclaimers Aims: Get a rough feel of how floating point works Know when to dig deeper Cover basics, testing, and optimisation Not an exhaustive trudge through algorithms + details This talk: IEEE754 mostly, but not quite ubiquitous Mostly C/Python examples, Linux/x86_64 No complex numbers Code samples available!

Code ex. 1 A problem (C) #include <values.h> float a = MAXINT; // 2147483648 float b = MAXLONG; // 9223372036854775808 float f = a + b; f == MAXLONG; // True or false?

Code ex. 1 A problem (C) #include <values.h> float a = MAXINT; // 2147483648 float b = MAXLONG; // 9223372036854775808 float f = a + b; f == MAXLONG; // True or false? // True! // IEEE754 only approximates real arithmetic

How is arithmetic on reals approximated? // float gives about 7 digits of accuracy *******---.------ MAXINT: 2147483648.000000 MAXLONG: 9223372036854775808.000000 *******------------.------ // ^ ^ // // Represented Lost beneath // unit of // least precision

Floating point representation (1) Sign exponent mantissa s mantissa * 2 exponent Sign bit: 0 = positive, 1 = negative Mantissa: 1.xxxxxxxxxx

FP representation (2) S EEEEEEEE 1 MMMMMMMMMMMMMMMMMMMMMMM // MAXINT: S = 0, M = 1.0, E = 158 A A A a 0 10011110 1 00000000000000000000000 + 1.0 * 2 158-127 = 2147483648.0 Mantissa has: implied leading 1 Exponent has: bias (-127 for float)

FP representation (2) S EEEEEEEE 1 MMMMMMMMMMMMMMMMMMMMMMM // MAXINT: S = 0, M = 1.0, E = 158 0 10011110 1 00000000000000000000000 + 1.0 * 2 158-127 = 2147483648.0 // MAXLONG: S = 0, M = 1.0, E = 190 Mantissa has: implied leading 1 Exponent has: bias (-127 for float) 0 10111110 1 00000000000000000000000 + 1.0 * 2 190-127 = 9223372036854775808.0

Code ex. 2 MAXLONG smallest increment // MAXLONG: S = 0, M = 1.0, E = 190 0 10111110 1 00000000000000000000000 + 1.0 * 2 190-127 = 9223372036854775808.0 0 10111110 1 00000000000000000000001 + 1.0000001192092896 * 2 190-127 = 9223373136366403584.0

On the number line MAXLONG + MAXINT (0.19% towards MAXLONG_NEXT) MAXLONG MAXLONG_NEXT (9223372036854775808.0)(9223373136366403584.0)

Code ex. 3 Precision and range summary Precision: Mantissa length Range: Exponent length Float, 4 bytes: 23 bit mantissa, 8 bit exponent Precision: ~7.2 digits Range: 1.17549e-38, 3.40282e+38 Double, 8 bytes: 52 bit mantissa, 11 bit exponent Precision: ~15.9 digits Range: 2.22507e-308, 1.79769e+308

Special cases When is a number not a number?

Code ex. 4, 5 Floating point closed arithmetic Integer arithmetic: 1/0 // Arithmetic exception Floating point arithmetic is closed: Domain (double): 2.22507e-308 <-> 1.79769e+308 4.94066e-324 <-> just beneath 2.22507e-308 +0, -0 Inf NaN Exceptions are exceptional traps are exceptions

Code ex. 6 A few exceptional values 1/0 = Inf // Limit -1/0 = -Inf // Limit 0/0 = NaN // 0/x = 0, x/0 = Inf Inf/Inf = NaN // Magnitudes unknown Inf + (-Inf) = NaN // Magnitudes unknown 0 * Inf = NaN // 0*x = 0, Inf*x = Inf sqrt(x), x<0 = NaN // No complex

Code ex. 7 Consequences // Inf, NaN propagation: double n = 1000.0; for(double i = 0.0; i < 100.0; i += 1.0) n = n / i; printf( %f, n); // Inf

Code ex. 8-12 Trapping exceptions (Linux, GNU) feenableexcept(int excepts) FE_INXACT FE_DIVBYZERO FE_UNDERFLOW FE_OVERFLOW FE_INVALID Inexact result - Division by zero - Underflow - Overflow - Invalid operand SIGFPE Not exclusive to floating point: int i = 0; int j = 1; j/i // Receives SIGFPE!

Code ex. 13 Back in the normal range Some exceptional inputs to some math library functions result in normal-range results: x = tanh(inf) // x is 1.0 y = atan(inf) // y is pi/2 (ISO C / IEEE Std 1003.1-2001)

Code ex. 14 Denormals x y == 0 implies x == y? Without denormals, this is not true: X = 2.2250738585072014e-308 Y = 2.2250738585072019e-308 // (5e-324) Y X = 0 With denormals: 4.9406564584124654e-324 Denormal implementation e = 0: Implied leading 1 is not a 1 anymore Performance: revisited later

Testing Getting getting right right

Assumptions Code that does floating-point computation Needs tests to ensure: Correct results Handling of exceptional cases A function to compare floating point numbers is required

Code ex. 15 Exact equality (danger) def equal_exact(a, b): return a == b equal_exact(1.0+2.0, 3.0) # True equal_exact(2.0, sqrt(2.0)**2.0) # False sqrt(2.0)**2 # 2.0000000000000004

Code ex. 16 Absolute tolerance def equal_abs(a, b, eps=1.0e-7): return fabs(a - b) < eps equal_abs(1.0+2.0, 3.0) # True equal_abs(2.0, sqrt(2.0)**2.0) # True

Code ex. 17 Absolute tolerance eps choice equal_abs(2.0, sqrt(2)**2, 1.0e-16) # False equal_abs(1.0e-8, 2.0e-8) # True!

Code ex. 18 Relative tolerance def equal_rel(a, b, eps=1.0e-7): m = min(fabs(a), fabs(b)) return (fabs(a b) / m) < eps equal_rel(1.0+2.0, 3.0) equal_rel(2.0, sqrt(2.0)**2.0) equal_rel(1.0e-8, 2.0e-8) # True # True # False

Code ex. 19 Relative tolerance correct digits eps Correct digits 1.0e-1 ~1 1.0e-2 ~2 1.0e-3 ~3 1.0e-16 ~16

Code ex. 20 Relative tolerance near zero equal_rel(1.0e-50, 0) ZeroDivisionError: float division by zero

Summary guidelines: When to use: Exact equality: Never Absolute tolerance: Expected ~ 0.0 Relative tolerance: Elsewhere Tolerance choice: No universal correct tolerance Implementation/application specific Appropriate range: application specific

Code ex. 21 Checking special cases -0 == 0 // True Inf == Inf // True -Inf == -Inf // True NaN == NaN // False Inf == NaN // False NaN < 1.0 NaN > 1.0 NaN == 1.0 isnan(nan) // False // False // False // True

Performance optimisation Manual and automated.

Code ex. 22 Division vs Reciprocal multiply // Slower (generally) a = x/y; // Divide instruction // Faster (generally) y1 = 1.0/y; // x86: RCPSS instruction a = x*y1; // Multiply instruction // May lose precision. // GCC: -freciprocal-math

Code ex. 23 Non-associativity float a = 1.0e23; float b = -1.0e23; float c = 1.0; printf("(a + b) + c = %f\n", (a + b) + c); printf("a + (b + c) = %f\n", a + (b + c)); (a + b) + c = 1.000000 a + (b + c) = 0.000000

Non-associativity (2) Re-ordering is unsafe Turned off in compilers by default Enable (gcc): -fassociative-math Turns on fno-trapping, also fnosigned-zeros (may affect -0 == 0, flip sign of -0*x)

Finite math only Assume that no Infs or NaNs are ever produced. Saves execution time: no code for checking/dealing with them need be generated. GCC: -ffinite-math-only Any code that uses an Inf or NaN value will probably behave incorrectly This can affect your tests! Inf == Inf may not be true anymore.

-ffast-math Turns on all the optimisations we ve just discussed. Also sets flush-to-zero/denormals-are-zero Avoids overhead of dealing with denormals x y == 0 -> x == y may not hold For well-tested code: Turn on ffast-math Do tests pass? If not, break into individual flags and test again.

-ffast-math linkage Also causes non-standard code to be linked in and called e.g. crtfastmath.c set_fast_math() This can cause havoc when linking with other code. E.g. Java requires option to deal with this: -XX:RestoreMXCSROnJNICalls

Summary guidelines Refactoring and reordering of floating point can increase performance Can also be unsafe Some transformations can be enabled by compiler Manual implementation also possible Make sure code well-tested Be prepared for trouble!

Wrap up

Floating point Finite approximation to real arithmetic Some corner cases: Denormals, +/- 0 Inf, NaN Testing requires appropriate choice of: Comparison algorithm Expected tolerance and range Optimisation: For well-tested code Reciprocal, associativity, disable edge case handling FP can be a useful approximation to real arithmetic

Code samples/examples: https://github.com/gmarkall/pitfallsfp