Pergunta

Provavelmente estou completamente errado e realmente não sei nada sobre isso, mas tenho uma pergunta sobre os tipos de dados de números decimais em linguagens de programação. Entendo que os carros alegóricos não são completamente precisos, porque são armazenados em binário com poder ou algo assim, mas sempre me perguntei por que os tipos de dados de números decimais não apenas armazenam um número como se não houvesse decimal, os cálculos também Se não houvesse um decimal, adicione -o depois. Como nesta situação:

2.159 * 3.507 --> 2159 * 3507 = 7571613
  ^^^     ^^^
  123     456

6 decimals in total... 7571613 -> 7.571613
                        ^^^^^^
                        654321

Então 2.159 * 3.507 = 7.571613

Por que não pode simplesmente funcionar assim?

Foi útil?

Solução

Isso é exatamente o que eles fazem. Um número de ponto flutuante é armazenado em forma de expoente. Vamos supor que estamos trabalhando em um computador baseado em decimal, para que não precise alterar todos esses números para binários.

Você está multiplicando 2.159 * 3.507, mas na realidade 2.159 é armazenado como 2159 * 10^-3 e 3.507 é armazenado como 3507 * 10^-3. Como estamos trabalhando em um sistema decimal, o 10 é assumido, então só temos que armazenar -3 sem o 10, assim: 2159,-3 ou 3507,-3. o -3 é a localização do "ponto flutuante": à medida que o ponto se move deixou o ponto flutuante diminui (.3507 é armazenado como 3507,-4) e à medida que o ponto se move à direita, o ponto flutuante aumenta (35.07 é armazenado como 3507,-2).

Quando você multiplica os dois juntos, o número decimal (ou o número binário em um computador binário) é a única coisa que se multiplicou. O ponto flutuante é adicionado! Então, nos bastidores, o que acontece é:

2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6

7571613,-6 é apenas 7571613 * 10^-6 (Lembre -se de que podemos assumir o 10 porque estamos trabalhando em um computador decimal) que é o mesmo que 7.571613.

Claro, o ponto flutuante não precisa ser -3, pode ser qualquer coisa que se encaixe no armazenamento:

21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613

E, claro, a maioria dos computadores não armazena as coisas em decimal, então os números reais seriam todos em binário, e o ponto flutuante seria algo como 2^-9 -> -9 ao invés de 10^-3 -> -3. Mas você entendeu a ideia.

Outras dicas

Isso é chamado "aritmética de ponto fixo" Pessoas fazem isso o tempo todo.

Ver http://gameprogram.com/4-fixed.html

Existem algumas implementações de aritmética de ponto fixo. No entanto, geralmente ficamos sem lugares decimais muito, muito rapidamente com o armazenamento de ponto fixo. É ideal para transações monetárias, onde sabemos que não vamos armazenar/nos preocuparmos com nenhum número irracional.

Além disso, para muitas outras coisas, a aritmética de ponto fixo simplesmente não vale a pena. O ponto flutuante é muito mais rápido.

Coisas para ler:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top