Gnomeの分数スケーリングが1.75ではなく1.7518248558044434であるのはなぜですか?

Gnomeの分数スケーリングが1.75ではなく1.7518248558044434であるのはなぜですか?

Gnome設定で175%ズームを設定すると、値は次の1.7518248558044434ように保存されます~/.config/monitors.xml

<monitors version="2">
  <configuration>
    <logicalmonitor>
      <x>0</x>
      <y>0</y>
      <scale>1.7518248558044434</scale>
      <primary>yes</primary>
      <monitor>
        <monitor spec>
          <connector>DP-3</connector>

なぜですか?最初は浮動小数点丸めエラーが原因であると思いましたが、1.75は正確な値を表すことができる幸せな数値の1つです。

ドワーフウェイランド43.3

答え1

事前設定された倍率(100%、125%など)は、解像度に対して水平および垂直に事前調整された仮想ピクセルの整数を提供する最も近い値に調整されます。 1.7518248558044434 値であると判断した場合、これはおそらく 2192 x 1233 仮想です。解像度があり、3840 x 2160モニターがあります。

この値で計算された幅が小数点4桁までだけ正確な理由は、単精度浮動3840/1.7518248558044434 = 2191.9999520937613小数点(IEEE-754 32ビット)でスケールを変換したようです。倍精度近似値3840/2192はに似ています1.7518248175182483が、値を単精度に変換してから再度倍精度に変換すると、1.7518248558044434正確な値が得られます。答えが示唆したように、Pythonでこれを行いました。 https://stackoverflow.com/a/43405711/60422:

>>> struct.unpack('f', struct.pack('f', 1.7518248175182483))[0]
1.7518248558044434

Stéphane ChazelasはPerlでそのラインを提案しました。

perl -e 'printf "%.17g\n", unpack "f", pack "f", 1.7518248175182483'

浮動小数点数をより高い精度に変換すると、より役に立たない数字に10進表現が与えられるのは、質問が提案する浮動小数点丸め誤差のタイプです。浮動小数点数の内部表現はバイナリなので、内部浮動小数点点の後の数字(バイナリなので、「バイナリ数」)は、2分割(1/2、1/4、1/8など)の累乗を表します。有限の10進数で表すことができる数字は、必ずしも有限の2進数表現を持つ必要はなく、その逆も同様です。これについて詳しくは、次をご覧ください。https://stackoverflow.com/a/588014/60422

単精度は一般的に約7つの小数有効数字に対して機能すると考えられ、これが私たちがここで見ているものです。

この数値によるスケール調整が実際にどのように機能するかを理解するために、関数はスケールに基づいて仮想幅と高さを計算し、整数でget_closest_scale_factor_for_resolutionないmutter場合は計算された幅で始まります。仮想高さを整数にする調整された倍率引数を提供する幅が見つかるまで、または放棄された比率が範囲外または検索しきい値を超える場合。https://gitlab.gnome.org/GNOME/mutter/-/blob/176418d0e7ac6a0418eea46669f33c8e3b03c4bd/src/backends/meta-monitor.c#L1960

知りたいなら開発者が整数ピクセルを得るために倍率を四捨五入することに決めた理由、答えはありませんが、私の推測は以前のバージョンとの互換性です。開発者は整数ピクセルを持つ人々のモニターに精通しているので、既存のソフトウェアはそれのために設計されています。

答え2

別の理論:1.7518248558044434のおおよその有理数は2192/1233ではありませんが、より単純な240/137 = 1.7518248175182481...倍数の10進表現は8ビット周期を持ちます。)したがって、2160 x 1233を含むこの比率を提供するピクセル単位の高さと幅については、いくつかの可能性があります。

しかし、あなたは240/137が近いですが、それほど近いわけではないと言います。もう一つの良い近似は3673843/2097152です。より近い遊離数を得るには、分子と分母を数千倍大きくする必要があります。 1/2097152 は 2^{-21} です。したがって、これは240/137がバイナリ浮動小数点数に格納され、22の仮数ビット(バイナリ小数点の左側に1、右側に21)のための十分なスペースがあることを意味します。 (これらのビット数は、存在する可能性があるすべての末尾のゼロを無視します。)その後、バイナリ表現よりも精度がはるかに高い10進数に変換されます。

関連情報