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