What does gcc’s ffast-math actually do?

-ffast-math does a lot more than just break strict IEEE compliance. First of all, of course, it does break strict IEEE compliance, allowing e.g. the reordering of instructions to something which is mathematically the same (ideally) but not exactly the same in floating point. Second, it disables setting errno after single-instruction math functions, which means … Read more

Which is the first integer that an IEEE 754 float is incapable of representing exactly?

2mantissa bits + 1 + 1 The +1 in the exponent (mantissa bits + 1) is because, if the mantissa contains abcdef… the number it represents is actually 1.abcdef… × 2^e, providing an extra implicit bit of precision. Therefore, the first integer that cannot be accurately represented and will be rounded is: For 32-bit floats, … Read more

How to suppress scientific notation when printing float values?

Using the newer version ”.format (also remember to specify how many digit after the . you wish to display, this depends on how small is the floating number). See this example: >>> a = -7.1855143557448603e-17 >>> ‘{:f}’.format(a) ‘-0.000000’ as shown above, default is 6 digits! This is not helpful for our case example, so instead … Read more

How can I compare two floating point numbers in Bash?

More conveniently This can be done more conveniently using Bash’s numeric context: if (( $(echo “$num1 > $num2” |bc -l) )); then … fi Explanation Piping through the basic calculator command bc returns either 1 or 0. The option -l is equivalent to –mathlib; it loads the standard math library. Enclosing the whole expression between … Read more

Compare double to zero using epsilon

Assuming 64-bit IEEE double, there is a 52-bit mantissa and 11-bit exponent. Let’s break it to bits: 1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0 = 1 The smallest representable number greater than 1: 1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1 + 2^-52 Therefore: epsilon = (1 + 2^-52) – … Read more

Why does Python’s hash of infinity have the digits of π?

Summary: It’s not a coincidence; _PyHASH_INF is hardcoded as 314159 in the default CPython implementation of Python, and was picked as an arbitrary value (obviously from the digits of π) by Tim Peters in 2000. The value of hash(float(‘inf’)) is one of the system-dependent parameters of the built-in hash function for numeric types, and is … Read more