Qualquer ponto flutuante binário pode ser formatado exatamente em decimal. A sequência resultante pode ser um pouco longa, mas é possível. No meu artigo sobre ponto flutuante , abordo a importância da precisão e agora quero essa função. Esse desafio é escrever um programa ou função que use um valor de ponto flutuante como entrada e formate uma string decimal exata como saída.
Para garantir que estamos trabalhando com os números de ponto flutuante corretos, um formato preciso deve ser fornecido como entrada para o programa. Este formato será dois inteiros Significand Exponent
, onde o valor real do ponto flutuante é Significand * 2 ^ Exponent
. Observe que qualquer valor pode ser negativo.
Específicos:
- O alcance e a precisão de pelo menos um flutuador de 32 bits devem ser suportados (nenhuma entrada vai além disso)
- O valor decimal formatado deve ser uma representação exata (basta fechar o suficiente para garantir que uma ponta redonda correta volte a flutuar não é o suficiente)
- Não confiamos que as funções de formatação de ponto flutuante da biblioteca padrão sejam corretas o suficiente nem rápidas o suficiente (ex:)
printf
e, portanto, elas não podem ser usadas. Você deve fazer a formatação. Funções de formatação / conversão integrais são permitidas. - Pode não haver zeros à esquerda ou à direita, exceto o zero inicial necessário na frente do
.
se não houver um componente de número inteiro - É permitida uma função ou programa inteiro.
Exemplos:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
O menor código vence.
code-golf
floating-point
edA-qa mort-ora-y
fonte
fonte
.0
?0.abc
não for um zero inicial, não será um zeroabc.0
à direita..0
números inteiros ao lidar com números de ponto flutuante. Veja, por exemplo, Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Sua lógica ainda é inconsistente.Respostas:
CJam, 43
Experimente online
Explicação:
O programa trabalha com expoentes de até ± 999, quase com precisão dupla (64 bits). Ele separa o sinal de menos (se presente) do significando, multiplica por 10 999 e depois muda um pouco com o expoente, que agora é um cálculo exato. Em seguida, ele fecha à esquerda com zeros se o resultado tiver menos de 1000 dígitos, separa os últimos 999 dígitos como parte fracionária, remove os zeros à direita convertendo seu reverso para inteiro, adiciona um ponto decimal, se necessário, e junta tudo novamente.
No final, o sinal de menos (se houver) e a sequência final são automaticamente impressos juntos.
fonte
CJam, 50 bytes
Este é um programa completo que lê de STDIN. Experimente on-line no intérprete CJam .
Verifique todos os casos de teste de uma só vez.
fonte
GNU sed + dc, 65
A pontuação inclui +1 para a
-r
opção do sed .Fiquei tentado a reivindicar esta
dc
resposta apenasC8k& 2r^*p
para uma pontuação de 10, masdc
tem algumas peculiaridades de formatação:_
vez de-
|n| < 1
deve ser adicionadoPortanto, a expressão dc é agrupada e avaliada
sed
para cuidar do acima.Saída de teste:
fonte
dc
viola minha regra de usar uma função de formatação padrão.dc
está ok, dado que "aritmética de precisão fixa ilimitada ou de alta precisão é permitida" .dc
Op
comando não é uma " função de formatação de ponto flutuante" - é uma função de impressão de precisão arbitrária. Estou definindo a precisão para 128 casas decimais (C8k
), o que acho mais do que suficiente para qualquer flutuação de 32 bits.