Pergunta

Todos os métodos em Do sistema.Matemática leva double como parâmetros e retorna parâmetros.As constantes são também do tipo double.Eu verifiquei MathNet.Números, e o mesmo parece ser o caso.

Por que isso?Especialmente para constantes.Não decimal deveria ser mais exato?Não que, muitas vezes, ser útil ao fazer cálculos?

Foi útil?

Solução

Este é um comércio clássico de velocidade versus versus.

No entanto, lembre -se de que, para o PI, por exemplo, a maioria dos dígitos que você precisará é de 41.

O maior número de dígitos de Pi que você precisará é 41. Para calcular a circunferência do universo com um erro menor que o diâmetro de um próton, você precisa de 41 dígitos de Pi †. Parece seguro concluir que 41 dígitos são precisão suficiente no PI para qualquer problema de medição de círculo que você provavelmente encontrará. Assim, nos mais de um trilhão de dígitos do PI calculado em 2002, todos os dígitos além do 41º não têm valor prático.

Além disso, decimal e duplo têm uma estrutura de armazenamento interno ligeiramente diferente. Os decimais são projetados para armazenar dados da base 10, onde, como duplas (e flutuadores), são feitos para manter dados binários. Em uma máquina binária (como cada computador existente), um duplo terá menos bits desperdiçados ao armazenar qualquer número dentro de seu intervalo.

Considere também:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Como você pode ver, o decimal tem uma faixa menor, mas uma precisão mais alta.

Outras dicas

Não, decimais não são mais "exata" do que o dobro, ou para essa matéria, qualquer tipo.O conceito de "exatidão"(quando falando sobre representações numéricas em um compuiter), é o que há de errado.Qualquer tipo é absolutamente 100% exato, representando alguns os números.bytes não assinados são de 100% exato, representando os números inteiros de 0 a 255.mas eles não são bons para as frações ou para negativos ou números inteiros fora do intervalo.

As casas decimais são 100% exato, representando um determinado conjunto de base 10 valores.duplos (desde que armazenar o seu valor usando binário IEEE exponencial de representação) são exato, representando um conjunto de binário os números.Nem é mais exata do que os outros em geral, eles são simplesmente para diferentes fins.

Para elaborar um pouco furthur, desde que me parece não ser clara o suficiente para alguns leitores...

Se você tomar cada número que é representável como um decimal, e marcar cada um deles em uma linha de número, entre todos par adjacente deles há um adicional de infinity de números reais que são não representáveis como um decimal.Exatamente a mesma declaração pode ser feita sobre os números que podem ser representados como um casal.Se você marcou cada decimal no número da linha em azul, e cada casal em vermelho, exceto para os números inteiros, haveria muito poucos lugares em que o mesmo valor foi marcado em ambas as cores.Em geral, para 99.99999 % das marcas, (por favor, não sinistro meu percentagem) o conjunto azul (casas decimais) é um conjunto completamente diferente de números de vermelho (o casal).

Isso porque, pela nossa definição para o conjunto azul é que ela é uma base de 10 mantissa/expoente representação, e uma cama de casal é uma base de 2 mantissa/expoente representação.Qualquer valor representado como base 2 mantissa e o expoente, (1.00110101001 x 2 ^ (-11101001101001) significa assumir o valor de mantissa (1.00110101001) e multiplicá-lo por 2 elevado à potência de expoente (quando o expoente é negativo, isto é equivilent para dividir por 2 à potência do valor absoluto do expoente).Isso significa que, quando o expoente é negativo (ou de qualquer parte da mantissa é uma fração binária) o número não pode ser representado como um decimal mantissa e o expoente, e vice-versa.

Para qualquer número real arbitrário, que cai aleatoriamente sobre o real número de linha, vai ser mais próximo de um azul casas decimais, ou para um dos vermelha duplos.

Decimal é mais preciso, mas tem menos um intervalo. Você geralmente usaria o dobro para cálculos de física e matemática, mas usaria decimal para cálculos financeiros e monetários.

Veja os seguintes artigos no MSDN para obter detalhes.

Dobrohttp://msdn.microsoft.com/en-us/library/678hzkk9.aspx

Decimalhttp://msdn.microsoft.com/en-us/library/364x0z75.aspx

Parece que a maioria dos argumentos aqui para "não faz o que eu quero" é ", mas é mais rápido", bem, a biblioteca Ansi C+GMP, mas ninguém está defendendo isso certo?

Se você deseja controlar particularmente a precisão, existem outros idiomas que levaram tempo para implementar a precisão exata, de maneira controlável pelo usuário:

http://www.doughellmann.com/pymotw/decimal/

Se a precisão é realmente importante para você, provavelmente é melhor usar idiomas que os matemáticos usariam. Se você não gosta de Fortran, o Python é uma alternativa moderna.

Qualquer que seja o idioma em que você esteja trabalhando, lembre -se da regra de ouro: evite misturar tipos ... Então converta A e B para ser o mesmo antes de tentar um operador B

Se eu arriscar um palpite, diria que essas funções aproveitam a funcionalidade matemática de baixo nível (talvez em c) que não use decimais internamente e, portanto, retornar um decimal exigiria um elenco de dobro para decimal de qualquer maneira. Além disso, o objetivo do tipo de valor decimal é garantir a precisão; Essas funções não e não podes Retornar resultados 100% precisos sem precisão infinita (por exemplo, números irracionais).

Nem decimais nem flutuantes ou duplos são bons o suficiente se você precisar de algo para ser preciso. Além disso, Decimal é tão caro e exagerado por aí está se tornando uma piada regular.

Se você trabalha em frações e precisar de precisão final, use frações. É a mesma regra antiga, converta uma vez e somente quando necessário. Suas regras de arredondamento também variarão por aplicativo, domínio e assim por diante, mas com certeza você pode encontrar um ou dois exemplos estranhos, onde é adequado. Mas, novamente, se você deseja frações e precisão definitiva, a resposta não é usar nada além de frações. Considere que você também pode querer um recurso da precisão arbitrária.

O problema real do CLR em geral é que ele é tão estranho e simples quebrado para implementar uma biblioteca que lida com numéricos de maneira genérica, em grande parte devido ao design primitivo ruim e à falha do compilador mais popular da plataforma. É quase o mesmo que no Java Fiasco.

O dobro acaba sendo o melhor compromisso que cobre a maioria dos domínios, e funciona bem, apesar do fato de que a Sra. Jit ainda é incapaz de utilizar uma tecnologia da CPU com cerca de 15 anos agora.

Peça para usuários de compiladores de desaceleração do MSDN

O dobro é do tipo embutido. O IS é apoiado pelo FPU/SSE Core (anteriormente conhecido como "Coprocessador de Matemática"), é por isso que é incrivelmente rápido. Especialmente nas funções de multiplicação e científica.

Decimal é na verdade uma estrutura complexa, composta por vários números inteiros.

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