えびちゃんの日記

えびちゃん(競プロ)の日記です。

AHC 048 の浮動小数点演算について

浮には興味があるものの、ヒュにはないので見落としてしまいます。

atcoder.jp

本編

コード読み

src/lib.rs を見ます。

まずは gen(..) 以外を読みます。 四則演算以外の関数として .sqrt(), .round(), .powi(2), .max(0.0) が使われていますが、これは問題ないでしょう。

続いて gen() を読みます。 .powf(_).ln() などは可搬性があまり期待できなさそうです。Iterator.sum::<f64>() についてはどうなんでしょう。 Python だと sum()アルゴリズムが 3.12 で変わり、sum([0.1] * 10) の結果が変わるようになりましたが、Rust では現状は特にそういうことはしていなさそうです。

github.com

mix() の中の内積の計算の部分で勝手に FMA 命令が使われると破綻しますが、ちょっと試した感じだと問題なさそうな気がします。LLVM 側がどうしているかのちゃんとしたソースは知りませんが、IEEE 754 準拠ならそういうことをしてはいけないので信じてもいいような気もします。

godbolt.org

.ln() を経由して作った数 1000 個についての和の定数倍の .round() は、環境(というかライブラリ)に応じて値が変わるケースがありそうですが、乱数で作る前提だと言われるとちょっと構成するのは厳しい気もします。

撃墜?

$D$ についてのケースは見つかりました。

$\gdef\libmpowf#1#2{\operatorname{\texttt{powf}}(#1, #2)}$

$x = \texttt{1}.\texttt{C3B16FE640F44}_{(16)}\times 2^1$ について考えます。 $$ 10^x = \texttt{1}.\texttt{{\small A66FFFFFFFFF}{\footnotesize F803DA175AE6}{\scriptsize 54D2C3F47F41}{\tiny\ldots}}_{(16)}\times 2^{11} $$ です。AtCoder 環境では $\libmpowf{10}{x} = \texttt{1}.\texttt{A66FFFFFFFFFF}_{(16)}\times 2^{11}$ ですが、$\libmpowf{10}{x} = \texttt{1}.\texttt{A67}_{(16)}\times 2^{11}$ になる環境が確認できました。これにより、$D=3379$ になる場合と $D=3380$ になる場合に分かれます。

下記のコードをコードテストで実行すると、計算結果が異なっていることが確かめられます。言語は Zsh です。

長いので折り畳み

cat <<\EOF | base64 -d > powf_10_0x1c3b16fe640f44p-51
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
EOF
chmod u+x powf_10_0x1c3b16fe640f44p-51
./powf_10_0x1c3b16fe640f44p-51
GLIBC_TUNABLES=glibc.cpu.hwcaps=-FMA ./powf_10_0x1c3b16fe640f44p-51

コードおわり $\eod$

GLIBC_TUNABLES=glibc.cpu.hwcaps=-FMA については下記の記事に書きました。「AtCoder 環境で変なことをしたら計算結果が変わったよ」ということではなくて、「FMA 命令がサポートされていない環境では実際にそうなる」という感じです。

rsk0315.hatenablog.com

元となるコード自体は下記です。

fn main() {
    let x: f64 = "10.0".parse().unwrap();
    let y: f64 = "3.528852450779512".parse().unwrap();
    println!("{}", x.powf(y));
}

10.0_f64.powf(3.528852450779512) と書くとコンパイル時に計算された値が埋め込まれてしまったので、それを防ぐためのステップを加えました。パースの部分で差異が起きているわけではないことは、デバッガを使いながら __ieee754_pow_fma__ieee754_pow_sse2 を直接呼んだりすることなどで確かめられます。文字列からの変換は correctly rounded を仮定できると思っていますが、嫌な人は f64::from_bits(_) とかを使って確かめるといいかもしれません。

下記についてふんわりしているので、撃墜と呼べるのかはわかりません。

  • gen() の部分までは「配布ツールもジャッジプログラムと完全に同一の挙動をするように実装されている」が保証されているわけではない?
  • rand_chacha::ChaCha20Rng::seed_from_u64(seed) で該当のケースを生成するような seed の存在は謎

本ではない編

気になった部分を挙げていきます。

重箱つんつん

コード中で x * 1e-5 という書き方がしばしば出てきますが、これは $x \otimes \roundcirc{10^{-5}}$ の意味であって、$x \oslash 10^5 = \roundcirc{x\cdot 10^{-5}}$ とは異なります。本来は避けられる丸めが余分に一回あるということです。

実際、たとえば $$ 3 \oslash {10^5} = (3 + 22432\cdot 2^{-68})\cdot 10^{-5} $$ ですが、 $$ 3 \otimes \roundcirc{10^{-5}} = (3 + 122432\cdot 2^{-68})\cdot 10^{-5} $$ です。気にするほどの誤差ではないという立場もありつつ、相対誤差で言えば $5.46$ 倍程度に大きくなっているので、なんだかな〜という気持ちがあります。 精度よりも速度を重視していますと言われれば(少なくともこの文脈では)納得はできます。


次です。

操作可否の判定

$v\lt 1-10^{-6}$ の場合 [...] 操作 2 は実行できない。

$1-10^{-6}$ と書いている部分は実際には $1\ominus \roundcirc{10^{-6}}$ や $\roundcirc{1-10^{-6}}$ の意味なのか?というところが気になります*1。 というのも、コード中で v < 1.0 - 1e-6 と判定していますが、この右辺の実際の値は $$ 1 \ominus \roundcirc{10^{-6}} = (999999-4047\cdot 2^{-47})\cdot 10^{-6} \lt 1-10^{-6} $$ です。よって、$v = 1 \ominus \roundcirc{10^{-6}}$ だった場合、$v\lt 1-10^{-6}$ でありながらも操作 2 が実行できることになります。

これも「そういうところを厳密にやって気持ちよくなるのはえびちゃんだけですよ笑」と言われると、険しい気持ちになりつつ納得は一応できます。


三つ目です。

倍精度浮動小数(double)

浮動小数点 (floating-point) 数 (number) なので、浮動小数という呼び方には共感できないところがあります。「浮動小数点数」なのか「浮動小数点数」なのかどっちですか? 浮動点数*2とか浮点数とかの方が納得できます。実際、中文では浮点数(浮點數)と呼ぶみたいです (cf. 浮点数运算 - 维基百科)。

floating-point datum や floating-point number といった用語についても IEEE 754 で定義されています。過去に書いた記事でも少し触れました。

rsk0315.hatenablog.com


四つ目です。

$\mathrm{rand\_double}(L,U)$: $L$ 以上 $U$ 以下の実数値を一様ランダムに生成する。

[...] $x_k = -\ln \mathrm{rand\_double}(0, 1)$ により生成する。

$0$ が生成されたとき $-{\ln 0}$ になってこわれそうだなと思いました。

なお、rng.gen::<f64>() の内部で使われている rand::distributions::Standard を見ると、$[0\lldot 1]$ ではなく $[0\lldot 1)$ に見えました。

あとがき

境界付近の値を全探索して、FMA 起因で変わるケースがたまたま出てきたときが一番テンションが高くて、あとは (-’’-;) という感じでした。 libc の実装次第で、もっといろいろ見つかるかもしれません? $T$ の方は見つかりませんでしたが、$D$ の方で M2 Mac と差異があるケースとしては下記がありました。 $$ \begin{aligned} 10^{\texttt{1}.\texttt{7057235B3EE78}_{(16)}\times 2^1} &= \texttt{1}.\texttt{{\small 794000000000}{\footnotesize 07F9E18EE17C}{\scriptsize AEF86997B0EA}{\tiny\ldots}}_{(16)}\times 2^9 \\ 10^{\texttt{1}.\texttt{FE70F8B86E1B1}_{(16)}\times 2^1} &= \texttt{1}.\texttt{{\small 2FDBFFFFFFFF}{\footnotesize F8055416F30B}{\scriptsize CB808AF4D765}{\tiny\ldots}}_{(16)}\times 2^{13} \\ \end{aligned} $$ .round() の結果、前者は $(754, 755)$ で後者は $(9723, 9724)$ でした。

探索に使ったコード

py='
from binascii import hexlify
from hashlib import sha256
from math import inf, log10, log2, nextafter
from struct import pack

# let mut D = f64::round(f64::powf(10.0, rng.gen_range(1.0..4.0))) as i32;
# let mut T = f64::round(4000.0 * f64::powf(2.0, rng.gen_range(0.0..4.0))) as usize;

nextdown = lambda x: nextafter(x, -inf)
nextup = lambda x: nextafter(x, inf)

xs = []
n = 10**4
# n = 4000 * 2**4
for i in range(n):
    y = i + 0.5
    x = log10(y)
    # x = log2(y)
    xs.extend([nextdown(x), x, nextup(x)])

xs = [*filter(lambda x: 1.0 <= x < 4.0, xs)]
# xs = [*filter(lambda x: 0.0 <= x < 4.0, xs)]
# print(len(xs))

ys = []
for x in xs:
    y = round(10**x)
    # y = round(4000 * 2**x)
    ys.append((x, y))

# b = pack(f"<{len(ys)}d", *ys)
# digest = sha256(b).digest()
# print(hexlify(digest).decode().upper())
print(*ys, sep="\n")
'

python3 -c "$py" > out-fma.txt
GLIBC_TUNABLES=glibc.cpu.hwcaps=-FMA python3 -c "$py" > out-no-fma.txt

diff out-fma.txt out-no-fma.txt

log2log10 の出力が違うと面倒な感じになりますが、そういう場合は別途よしなにします。$\eod$

あまり M2 Mac のことをわかっていないのですが、libsystem_m.dylib`pow とか /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0) とか書いてありました。

$\log_e(x)$ や $e^x$ については TMD が解決済みだったと記憶していますが、二変数であるところの $x^y$ はとても大変で、まだまだ未解決だったと記憶しています。記憶でしゃべりすぎ。解決される日は来るのでしょうか。

おわり

おわりです。

*1:これら二つの値は(たまたま)一致しています。

*2:不動点と紛らわしくて嫌われそう。