2015-07-03 6 views
1
-module(test2). 
-export([main/1]). 
calc(Cnt, Total) when Cnt > 0 -> 
    calc(Cnt - 1, (Total + 2 * 34 + 1)/2 * 39); 
calc(0, Total)-> 
    io:format("~p ~n", [Total]), 
    ok. 
main([A])-> 
    Cnt = list_to_integer(A), 
    calc(Cnt, 1). 

Это странно выполнение выше кодов:Эрл: ошибка исключения при вычислении арифметического выражения

$ escript test2.beam 900000000 
escript: exception error: an error occurred when evaluating an arithmetic expression 
    in function test2:calc/2 (test2.erl, line 4) 
    in call from escript:run/2 (escript.erl, line 752) 
    in call from escript:start/1 (escript.erl, line 276) 
    in call from init:start_it/1 
    in call from init:start_em/1 

Если удалить * 39, то все в порядке.

В чем проблема?

ответ

2

Переполнение с плавающей точкой. Оператор деления с плавающей запятой / превращает вашу переменную Total в число с плавающей запятой с двойной точностью. После некоторого количества итераций результат умножения на 39 превышает максимальное значение, которое может удерживать этот тип.

+0

Тогда целое число является произвольным размером и никогда не переполняется, но поплавок является фиксированным размером и будет переполняться? – kingluo

Смежные вопросы