# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3741 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3489 |
7 | Radewoosh | 3483 |
8 | Kevin114514 | 3442 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
2 | atcoder_official | 162 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | nor | 150 |
Name |
---|
the blog: *about binary search*
the code:
Please tell Bjarne Stroustrup to add templated
int_least_t
to the STL instead of the concrete type definitions :("I am pretty sure that this method has been explored before" Yes.
Great Blog!
Since most problems allow some relative error in the answer, it is usually not necessary to do the full 64 iterations. For example, if the answer is positive and we can tolerate a $$$10^{-6}$$$ relative error, then we can do binary search on doubles like this:
Outside of annoying edge cases (0, NaN, inf, subnormal, etc.), the condition
get_int(a) + (1ULL << 32) >= get_int(b)
implies the relative error of $$$a$$$ and $$$b$$$ is at most $$$2^{-20}$$$ < $$$10^{-6}$$$.The 64 bits in an IEEE 754 double has the following format:
Except the special cases mentioned, it stores the value $$$2^{\text{exponent - 1023}} \times (1 + \text{mantissa} \times 2^{-52})$$$. The above example shows $$$2^{\text{1024 - 1023}} \times (1 + 2^{51} \times 2^{-52}) = 3.0$$$.
Let $$$e_a, m_a, e_b, m_b$$$ be the exponents and mantissas of $$$a$$$ and $$$b$$$.
QED.
The same could work for any $$$b < 52$$$ for $$$2^{-(52 - b)}$$$ precision. How to modify nor's template to support this is an exercise for the reader.