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는 정확한 값을 표현할 수 있는 행복한 숫자 중 하나입니다.

난쟁이 웨이랜드 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'

부동 소수점 숫자를 더 높은 정밀도로 변환하면 더 쓸모없는 숫자로 십진수 표현이 제공되는 이유는 질문에서 제안하는 부동 소수점 반올림 오류의 유형입니다. 부동 소수점 숫자의 내부 표현은 이진이므로 내부 부동 소수점 점 뒤의 숫자 (이진수이므로 "이진수점")은 2분할(1/2, 1/4, 1/8 등)의 거듭제곱을 나타냅니다. 유한한 십진수로 표현될 수 있는 숫자는 반드시 유한한 이진수 표현을 가질 필요는 없으며 그 반대도 마찬가지입니다. 이에 대한 자세한 내용은 다음을 참조하세요.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... (더 가까운 유리수를 얻으려면 분자와 분모를 1390배 더 크게 만들어야 합니다. 그리고 예, 1 /137의 배수에 대한 십진수 표현은 8비트 주기를 갖습니다.) 따라서 2160 x 1233을 포함하여 이 비율을 제공하는 픽셀 단위의 높이와 너비에 대한 여러 가지 가능성이 있습니다.

그러나 당신은 240/137이 가깝지만 그렇게 가깝지는 않다고 말합니다. 또 다른 좋은 근사치는 3673843/2097152입니다. 더 가까운 유리수를 얻으려면 분자와 분모를 수천 배 더 크게 만들어야 합니다. 1/2097152는 2^{-21}입니다. 따라서 이는 240/137이 이진 부동 소수점 숫자에 저장되고 22개의 가수 비트(이진 소수점 왼쪽에 1, 오른쪽에 21)를 위한 충분한 공간이 있음을 의미합니다. (이러한 비트 수는 존재할 수 있는 모든 후행 0을 무시합니다.) 그런 다음 이진 표현보다 정밀도가 훨씬 높은 십진수로 변환됩니다.

관련 정보