じゃクイズね
— えびちゃん🍑🍝🦃 (@rsk0315_h4x) 2025年4月9日
浮動小数点数 x, y ∈ [1..2) であって、|(x ⊘ y) - (x ÷ y)| が最大になるものはな〜んだ
(前提:binary64, tiesToEven)
クイズがあって、眠れなかったので、書きます。
回答
$x=2-\dfrac1{2 ^ {50}},y=2-\dfrac1{2 ^ {25}}-\dfrac1{2 ^ {52}}$ である。
証明:まず、$x,y$ を $2 ^ {52}$ 倍することで $x,y\in\lbrack2 ^ {52},2 ^ {53}\rparen$ な整数としても結果は変わりません。 $x\div y$ は $\left\lbrack\dfrac{2 ^ {52}}{2 ^ {53}-1},2-\dfrac1{2 ^ {52}}\right\rbrack$ なので、これを丸めた結果である $x\oslash y$ は $(0.5,2)$ に含まれる浮動小数点数です。 このような浮動小数点数全体の集合を $S$ としましょう。
$y$ を fix して、$n$ を動かしたときの $\dfrac ny\ (y\lt 2n\lt 4y)$ と $S$ との距離の上界を考えます。 $S$ の隣り合った $2$ 点のもっとも広い間隔の長さが $\dfrac1{2 ^ {52}}$ で、$y\lt2 ^ {53}$ なのでちょうど中点(奇数${}\div2 ^ {53}$ の形の値)に来ることはありません。 $\dfrac ny$ が中点に最も近づいたときの距離は少なくとも $\dfrac1{\operatorname{lcm}(y,2 ^ {53})}$ です。 よって、上界 $\dfrac1{2 ^ {53}}-\dfrac1{\operatorname{lcm}(y,2 ^ {53})}$ が得られます。
一旦、上の $(x,y)$ がこれを達成していることを確認しましょう。 \[\dfrac xy=1+\dfrac{134217725}{2 ^ {53}-134217729}=1+\dfrac{134217727}{2 ^ {53}}-\dfrac1{(2 ^ {53}-134217729)2 ^ {53}}\] となっています(???)。 検算はみなさんでしておいてください。
134217725 * (1 << 53) == 134217727 * ((1 << 53) - 134217729) - 1
コピペ用です。
あとは、これを達成するような条件を満たす $x$ が存在するような奇数 $y$ の最大値が $2 ^ {53}-134217729$ であることを示せばよいです($\gcd(y,2 ^ {53})\gt1$ のとき、上界は $y=2 ^ {53}-134217729$ のときより真に小さくなっています)。
上界を達成するためには $\dfrac xy\gt1$ が必要なので、$y\lt x\lt2 ^ {53}$ です。 $a=2 ^ {53}-y,b=2 ^ {53}-x$ を導入して、$0\lt b\lt a$ としておきます。 $Kx\equiv\pm1\pmod y$ が成り立っている必要があります。 $K\equiv a\pmod y$ に注意すると、これは $K(K-b)\equiv a(a-b)\equiv\pm1\pmod y$ です。 $a$ が奇数であることから、$a$ を決めるごとに $b=a\pm\dfrac1a\pmod y$ と決められます。
あとは $a$ を $1$ から試してください。~完~
理詰めをもう少し進めると、探索範囲を狭めることはできます。 $0\lt b\lt a$ だったので、$a(a-b)\gt1$ です。 よって、$a(a-b)\geq y-1$ です。 これと $0\lt b$ から $a ^ 2\gt K$ が必要なので、$a\geq94906266$ から調べればよく、探索範囲が 3 割くらいになりました。
探索すべき $a$ の範囲の上界 $2 ^ {27}+1$ が得られていれば、$a(a-b)=\pm1+k(2 ^ {53}-a)$ かつ $a(a-b)\lt a ^ 2$ から、$k2 ^ {53}\pm1\ (1\leq k\leq 2)$ の約数となる $a$ のみを調べればよいとわかります。 確認すべき $a$ は上下界の情報とあわせて $104391567,104800143,118441921,120961657,133694463,134201345,134217727,134217729$ の $7$ 個だけになります。 ぎりぎり手でも確かめられそうじゃないですか?かなり無理そうな気持ちを抑えています、いま
おしまい
計算してみると、
\[1.0000000149011609718030513249686919152736663818359375\]
と
\[1.00000001490116108282535378748433363168500544161208\ldots\]
で、差は
\[1.11022302462515641716411339059776150342641779421347\ldots\times10 ^ {-16}\]
くらいになります。いかがでしたか?
ねむいので、嘘だったらごめんなさい(ぽか)