[Rio-pm] Chaves de hash

thiagoglauco em ticursos.net thiagoglauco em ticursos.net
Quinta Novembro 29 11:27:15 PST 2012


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: thiagoglauco em ticursos.net
>> To: rio-pm em 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, thiagoglauco em 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, <thiagoglauco em 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 em pm.org
>> >>>> http://mail.pm.org/mailman/listinfo/rio-pm
>> >>>
>> >>>
>> >>> _______________________________________________
>> >>> Rio-pm mailing list
>> >>> Rio-pm em pm.org
>> >>> http://mail.pm.org/mailman/listinfo/rio-pm
>> >> _______________________________________________
>> >> Rio-pm mailing list
>> >> Rio-pm em pm.org
>> >> http://mail.pm.org/mailman/listinfo/rio-pm
>> >
>> > _______________________________________________
>> > Rio-pm mailing list
>> > Rio-pm em pm.org
>> > http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm



Mais detalhes sobre a lista de discussão Rio-pm