Oh, also, I get different numbers in Haskell (and Python agrees from a incomplete check):

```haskell
> -- f32
> let nums = [3.14159265359, 2.0^100, -2.0 ^ 100, 1.0 / (2.0^100), 684729.48391, -8573.5918555] :: [Float]
> mapM_ (\n -> putStrLn $ show n ++ "  \t" ++ show (toRational n)) nums
3.1415927       13176795 % 4194304
1.2676506e30    1267650600228229401496703205376 % 1
-1.2676506e30   (-1267650600228229401496703205376) % 1
7.888609e-31    1 % 1267650600228229401496703205376
684729.5        1369459 % 2
-8573.592       (-4389679) % 512

> -- f64
> let nums = [3.14159265359, 2.0^100, -2.0 ^ 100, 1.0 / (2.0^100), 684729.48391, -8573.5918555] :: [Double]
> mapM_ (\n -> putStrLn $ show n ++ "\t" ++ show (toRational n)) nums
3.14159265359           3537118876014453 % 1125899906842624
1.2676506002282294e30   1267650600228229401496703205376 % 1
-1.2676506002282294e30  (-1267650600228229401496703205376) % 1
7.888609052210118e-31   1 % 1267650600228229401496703205376
684729.48391            367611342500051 % 536870912
-8573.5918555           (-4713381968463931) % 549755813888
```

(The format is  `<float>   <numerator> % <denominator>` .)