Onde estou agora o firewall bloqueia o pastebin. Pela sua explicação, verificar por regex seria uma solução segura. O número sera convertido para um string e, se a sua regex prevê uma margem segura para a imprecisão do ponto flutuante na sua aplicação, funciona sem problemas.

Em 2012-11-29 16:59, Aureliano Guedes escreveu:
Nossa, aqui virou uma arena de ideias, da para aprender muita coisa so lendo.

O problema é o seguinte, eu tenho uma lista nesse formato:

target: 01010101
length: 581
miRNA : hsa-miR-15a
length: 22

mfe: -24.4 kcal/mol
p-value: 0.334111

position 244
target 5' C UCUCCUGUGGUCUCU G U 3'
 CACA GACCA GUGCUGUU
 GUGU UUGGU CACGACGA
miRNA 3' AAUA U 5'

Conforme este arquivo http://pastebin.com/9v6WFUT7

Eu quero filtrar essa lista de acordo com o valor de mfe.

Exemplo, se mfe for menor que -30 e maior que -20 esta dentro.

Logo fiz da seguinte forma: http://pastebin.com/Dnhv0Zya

Funcionou, o problema era sono. Não percebi que a regex estava
pegando um espaço.

Quanto a usar reais como chave de hash, se eu tiver dois reais iguais
poderá ser um problema para acessar os valores,
mas em toda regra existe sua exceção.

No meu caso, o que me importa é que mfe esteja no intervalo determinado.

Caso descordem seria uma honra ler a explicação de qualquer um de vocês.

Date: Thu, 29 Nov 2012 16:44:50 -0200
From: thiagogla...@ticursos.net
To: rio-pm@pm.org
Subject: Re: [Rio-pm] Chaves de hash

Um exemplo mais preciso:

$ uname -a
SunOS cg01spo 5.10 Generic_138888-03 sun4v sparc
SUNW,SPARC-Enterprise-T5120

$ perl -E '
if (0.2 > 0.19999999999999997){
say "0.2 is greater than 0.19999999999999997";}
else {
say "Floating Point is not true real"};'
0.2 is greater than 0.19999999999999997
$

$ perl -E '
if (0.2 > 0.19999999999999998){
say "0.2 is greater than 0.19999999999999998";}
else {
say "Floating Point is not true real"};'
Floating Point is not true real
$

Por que é importante saber essas coisas?
http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html






Em 2012-11-29 15:13, thiagogla...@ticursos.net escreveu:
>> Não se compara reais por igualdade.
> Se você tem erro na igualdade, terá nas outras comparações se a
> diferença entre os números for menor que o maior acréscimo suportado
> pela plataforma:
>
> $ perl -E '
> if (0.2 > 0.19999999999999999999999999999999999999999999){
>> say "0.2 is greater than 0.19999999999999999999999999999999999999";}
>> else {
>> say "Floating Point is not true real"};'
> Floating Point is not true real
> $
>
> $ perl -E '
> if (0.2 > 0.199999){
> say "0.2 is greater than 0.199999";}
> else {
> say "Floating Point is not true real"};'
> 0.2 is greater than 0.199999
> $
>
> Então, comparar pontos flutuantes não é seguro. Nem igualdade, nem
> maio, nem menor.
>
> E mais: garanto que se você quer usar um número real como chave de
> Hash você tem um problema na análise da lógica do problema que está
> enfrentando e como solucioná-lo.
>
>
> Em 2012-11-29 10:36, Blabos de Blebe escreveu:
>> Na verdade é o contrário, não?
>>
>> Não se compara reais por igualdade.
>>
>> Se você usa reais como chaves de hash, você tem algum problema...
>>
>> Ao não controlar a representação interna em ponto flutuante, você
>> pode
>> nunca mais alcançar o valor relacionado à chave, se usar um número >> real como chave, pois qualquer bit diferente, mesmo que arredondando >> no mesmo número vai resultar num cálculo diferente na tabela hash.
>>
>> Igualdade entre númros reais constuma ser definida como algo assim:
>>
>> sub float_equal {
>> my ($first, $second) = @_;
>> my $threshold = 0.00000001 # arbitrário
>> return abs( $first - $second ) < $threshold;
>> }
>>
>> Converter para string antes de usar como chave de hash também não me
>> parece saudável, pois, embora a string vá funcionar bem no hash,
>> você
>> não garante que a conversão vai resultar sempre na mesma string, e
>> aí
>> vc se ferra do mesmo jeito.
>>
>> Por outro lado, se você nunca vai acessar o elemento do hash através
>> da chave, um foreach por keys() ou values() vai te retornar os
>> valores...
>>
>> Mas aí eu te perguntaria por que rails você está usando hash pra
>> isso...
>>
>>
>>
>> On Thu, Nov 29, 2012 at 6:47 AM, <thiagogla...@ticursos.net> wrote:
>>> Existe um problema aqui, diferente da comparação.
>>> A comparação de reais é problemática devido a estrutura interna do
>>> ponto
>>> flutuante. NÃO SE COMPARA REAIS POR MAIOR OU MENOR.Isso não é do
>>> Perl, mas
>>> das regras de aproximação usada pelos processadores.
>>>
>>> Rounding rules
>>>
>>> The standard defines five rounding rules. The first two round to a
>>> nearest
>>> value; the others are called directed roundings:
>>> Roundings to nearest
>>>
>>> Round to nearest, ties to even – rounds to the nearest value;
>>> if the
>>> number falls midway it is rounded to the nearest value with an even
>>> (zero)
>>> least significant bit, which occurs 50% of the time; this is the
>>> default for
>>> binary floating-point and the recommended default for decimal.
>>> Round to nearest, ties away from zero – rounds to the nearest
>>> value; if
>>> the number falls midway it is rounded to the nearest value above
>>> (for
>>> positive numbers) or below (for negative numbers); this is intended
>>> as an
>>> option for decimal floating point.
>>>
>>> Directed roundings
>>>
>>> Round toward 0 – directed rounding towards zero (also known as
>>> truncation).
>>> Round toward +∞ – directed rounding towards positive infinity
>>> (also
>>> known as rounding up or ceiling).
>>> Round toward −∞ – directed rounding towards negative infinity
>>> (also
>>> known as rounding down or floor).
>>>
>>> Se a comparação for inevitável, converta o seu número para string e
>>> compare
>>> ou determine um nível de precisão aceitável e faça bit a bit.
>>>
>>> Em 2012-11-28 21:42, Aureliano Guedes escreveu:
>>>>
>>>> Ola Monges.
>>>>
>>>> Estou com um problema simples mas que não acho a solução.
>>>>
>>>> Eu tenho um hash onde as chaves são valores numericos reais (a
>>>> maioria negativo e quase nenhum inteiro).
>>>> Estou limitando esses valores por um maximo e um minimo.
>>>>
>>>> foreach my $keys (keys %d) {
>>>> if ($keys <= $min and $keys >= $max) {
>>>> print "$d{$keys}";
>>>> }
>>>> }
>>>>
>>>> Problema que não da certo.
>>>> Ha algo de errado aqui??
>>>>
>>>> _______________________________________________
>>>> Rio-pm mailing list
>>>> Rio-pm@pm.org
>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>
>>>
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm@pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm@pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm

_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Responder a