AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 740319
Accepted
Damn Vegetables
Damn Vegetables
Asked: 2023-03-20 11:31:18 +0800 CST2023-03-20 11:31:18 +0800 CST 2023-03-20 11:31:18 +0800 CST

Por que a escala fracionária do Gnome é 1,7518248558044434 em vez de 1,75?

  • 772

Se eu definir a escala de 175% nas configurações do Gnome, o valor será salvo como 1.7518248558044434em ~/.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>

Por que é tão? A princípio, pensei que poderia ser devido a um erro de arredondamento de ponto flutuante, mas 1,75 é um daqueles números felizes cujo valor exato pode ser expresso.

Gnomo Wayland 43.3

gnome
  • 2 2 respostas
  • 7516 Views

2 respostas

  • Voted
  1. Best Answer
    rakslice
    2023-03-20T12:42:30+08:002023-03-20T12:42:30+08:00

    Os fatores de escala predefinidos (100%, 125%, etc.) são ajustados para os valores mais próximos que fornecem um número inteiro de pixels virtuais de pré-dimensionamento horizontal e verticalmente para sua resolução; a julgar pelo seu valor de 1,7518248558044434, provavelmente é 2192 x 1233 e você tem uma tela de 3840 x 2160.

    Além disso, por que a largura que você calcularia com esse valor, 3840/1.7518248558044434 = 2191.9999520937613, é precisa apenas cerca de quatro casas após o ponto decimal, claramente a escala foi convertida de ponto flutuante de precisão simples (IEEE-754 32 bits). A aproximação de precisão dupla de 3840/2192é mais parecida com 1.7518248175182483, mas se você converter esse valor em precisão simples e voltar para precisão dupla, obterá 1.7518248558044434precisão. Eu fiz isso com Python, conforme sugerido pela resposta https://stackoverflow.com/a/43405711/60422 :

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

    Stéphane Chazelas sugere o one-liner correspondente em Perl:

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

    Por que converter um número de ponto flutuante para uma precisão mais alta fornece uma representação decimal com mais dígitos inúteis é o tipo de erro de arredondamento de ponto flutuante a que a pergunta está se referindo - a representação interna do número de ponto flutuante é em binário e portanto, os dígitos após o ponto flutuante internamente (o "ponto binário", já que é binário) representam potência de 2 frações (1/2, 1/4, 1/8 e assim por diante). Um número que você pode expressar em um número finito de casas decimais não tem necessariamente uma representação finita em binário. Para saber mais sobre isso, consulte: https://stackoverflow.com/a/588014/60422

    A precisão única geralmente é considerada boa para cerca de 7 algarismos decimais significativos e é isso que estamos vendo aqui.

    Para ter uma ideia de como o ajuste do fator de escala realmente funciona, a get_closest_scale_factor_for_resolutionfunção in muttercalcula a largura e a altura virtuais do fator de escala e, se não forem números inteiros, começando com a largura calculada arredondada para baixo, tenta o número inteiro larguras ao redor da calculada em ambos os lados, expandindo para fora um pixel por vez, até encontrar uma largura que forneça um fator de escala ajustado que também tornaria a altura virtual um número inteiro, ou até desistir porque a escala foi saiu do alcance ou do limite de pesquisa. https://gitlab.gnome.org/GNOME/mutter/-/blob/176418d0e7ac6a0418eea46669f33c8e3b03c4bd/src/backends/meta-monitor.c#L1960

    Se você quer saber por que os desenvolvedores decidiram fazer isso , não tenho a resposta para isso, mas meu palpite é a compatibilidade com versões anteriores: os desenvolvedores estão acostumados com os monitores das pessoas com números inteiros de pixels, e é isso que o existente software lá fora é projetado para.

    • 53
  2. Rosie F
    2023-03-20T23:41:28+08:002023-03-20T23:41:28+08:00

    Outra teoria: o racional do qual 1,7518248558044434 é uma aproximação não é 2192/1233, mas o mais simples 240/137 = 1,7518248175182481... (Para obter um racional mais próximo, você precisaria de numerador e denominador maiores por um fator de 1390. E sim, as representações decimais de múltiplos de 1/137 têm um ciclo de 8 dígitos.) Portanto, existem várias possibilidades para a altura e a largura em pixels que dariam essa proporção, incluindo 2160 x 1233.

    Mas, você diz, 240/137 está perto, mas não tão perto. Outra boa aproximação é 3673843/2097152. Para obter um racional mais próximo, você precisaria de um numerador e um denominador maiores por um fator de milhares. 1/2097152 é 2^{-21}. Isso sugere que 240/137 foi armazenado em um ponto flutuante binário com espaço suficiente para 22 bits de mantissa: um bit à esquerda e 21 bits à direita do ponto binário. (Essas contagens de bits negligenciam quaisquer 0s à direita que possam existir.) Em seguida, convertidos em decimal com muito mais precisão do que naquela representação binária.

    • 6

relate perguntas

  • Como testar o Linux no suporte hidpi sem hardware real?

  • Parábola (semelhante ao Arch) - A atualização do ICU fez com que alguns programas exigissem duas versões diferentes da biblioteca do ICU. Ambos falham ao iniciar. Não pode se reproduzir

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

  • Desativar a maximização automática de janelas no Gnome3

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve