浮には興味があるものの、ヒュにはないので見落としてしまいます。
そういえばAHC048で(浮動小数使ってるのに) "なお、配布ツールもジャッジプログラムと完全に同一の挙動をするように実装されている。"って言いきってるのすごいなと思った(詳しくない)
— よすぽ (@yosupot) 2025年6月15日
本編
コード読み
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 では現状は特にそういうことはしていなさそうです。
mix()
の中の内積の計算の部分で勝手に FMA 命令が使われると破綻しますが、ちょっと試した感じだと問題なさそうな気がします。LLVM 側がどうしているかのちゃんとしたソースは知りませんが、IEEE 754 準拠ならそういうことをしてはいけないので信じてもいいような気もします。
.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 命令がサポートされていない環境では実際にそうなる」という感じです。
元となるコード自体は下記です。
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 で定義されています。過去に書いた記事でも少し触れました。
四つ目です。
$\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
log2
や log10
の出力が違うと面倒な感じになりますが、そういう場合は別途よしなにします。$\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$ はとても大変で、まだまだ未解決だったと記憶しています。記憶でしゃべりすぎ。解決される日は来るのでしょうか。
おわり
おわりです。