Lev Walkin (lionet) wrote,
Lev Walkin
lionet

Плавающая точка в Эрланге

Let it fail


Вычисления с плавающей точкой в Эрланге точно так же соответствуют парадигме Let it fail, как и всё остальное: при любом чихе вычисления вместо того, чтобы тихонько вернуть -inf, inf или nan, система бросает рантаймовое исключение.
1> 1.0/0.0.
** exception error: bad argument in an arithmetic expression
     in operator  '/'/2
        called as 1.0 / 0.0
2> 

Не очень понятно, хорошо это или плохо. Наверное, хорошо. Тем более, что fp exceptions можно и в сях врубить, тогда будет примерно такое же поведение при переполнении и ошибках.

Баг в ASN.1


Обнаружилось такое поведение вполне случайно, когда я нашёл ошибку в Эрланге при кодировании float() значений в ASN.1:
Here's a simple test case demonstrating inconsistency and mishandling of 0.0 floating point value.

Consider the following ASN.1 module:

      RealTest DEFINITIONS ::= BEGIN
          Real ::= REAL
          RealWrapper ::= SEQUENCE {
              real REAL
          }
      END

Running it through the asn1c to decode the 0.0 value encoded as NR3 and as X.690(07/2002)#8.5.2 (If the real value is the value zero, there shall be no contents octets in the encoding.)

1> asn1ct:compile('RealTest', []).
ok
2> asn1ct:decode('RealTest', 'Real', [9,6,3,48,46,69,43,48]).
{ok,"0.E+0"}
3> asn1ct:decode('RealTest', 'Real', [9,0]).
{ok,0}
% Until now everything is more or less OK.
4> asn1ct:decode('RealTest', 'RealWrapper', [48,8, 9,6,3,48,46,69,43,48]).
{ok,{'RealWrapper',"0.E+0"}}
% Here comes the trouble:
6> asn1ct:decode('RealTest', 'RealWrapper', [48,2, 9,0]).
{error,{asn1,{{badmatch,{0,<<>>}},
            [{'RealTest',dec_RealWrapper,3},
             {'RealTest',decode,2},
             {asn1rt,decode,3},
             {erl_eval,do_apply,5},
             {shell,exprs,7},
             {shell,eval_exprs,7},
             {shell,eval_loop,3}]}}}


Представление бесконечных значений


В отсутствии родного представления подобных неконечных значений в Эрланге, ожидаемое поведение ASN.1 декодера, когда он встречается с бесконечностями — возвращать атомы 'MINUS-INFINITY', 'PLUS-INFINITY', etc.
Tags: erlang
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 6 comments