The code computes sqrt(-1 * (log(-1 * (20 * 2)))^2).
The potentially failing functions are log and sqrt. Failure is determined by checking if the result is a "normal" floating point value. But 'double' and 'square' may also produce non-normal values, e.g. squaring a large float may produce infinity. So why doesn't double() return an Option as well?
Furthermore, checking if a value is normal is not correct. If x slightly exceeds 1, then log x is a small positive value, i.e. a denormal, and therefore log() will incorrectly report failure.
Floating point arithmetic already has a serviceable "Option" type in its non-finite values (NaN and infinities), so the best way to write this code is the naive way:
let result: f64 = sqrt(pow(-1 * (log(-1 * (20 * 2))), 2));
let success: bool = is_finite(result);
The Option monad only makes this code longer, slower, and buggier.