[erlang-patches] new float_to_list/2

Serge Aleynikov <>
Mon Jan 21 15:42:02 CET 2013


Thanks for expediting this for the upcoming release!

Just to make sure that Lukas suggestion doesn't go unnoticed - the only
remaining point not included in the patch (that can be addressed in a
later release) is taking advantage of the float formatting speedup in
erts/lib_src/common/erl_printf_format.c suggested by Lukas, which I
addressed in the attached email earlier in this thread.

On 1/21/2013 9:30 AM, Björn-Egil Dahlberg wrote:
> Great, I'll fetch and put into master-opu.
> 
> Hopefully we have found all issues. *crossing fingers*
>> For your convenience I repushed the change with this fix, that affected:
>>
>> bif.c
>> erlang.xml (documented reference to badarg instead of internal_error)
>> num_bif_SUITE.erl
>> Commit message
>>
>> Serge
>>
>> On 1/21/2013 9:14 AM, Björn-Egil Dahlberg wrote:
>>> Ok, so regarding internal_error.
>>>
>>> It is clearly specially handled in the vm, and in the debug vm an
>>> asserts checks for it *not* to be set, i.e.:
>>>
>>> Eshell V5.10  (abort with ^G)
>>> 1> erlang:float_to_list(1.0e300,  [{decimals, 1}]).
>>> Assertion failed: Value != am_internal_error in beam/beam_emu.c, line
>>> 5317
>>> Aborted (core dumped)
>>>
>>>
>>> I asked Björn and Patrik since they have been here the longest:
>>> - "How is exception internal_error handled, and what is special about
>>> it?"
>>> - "The what now?"
>>>
>>> Anyhow,
>>> EXC_INTERNAL_ERROR is defined by ((2 << 8) | EXC_ERROR | EXF_PANIC)
>>> where EXF_PANIC means uncatchable.
>>>
>>> My take on it is, it is literally meant to be an internal error and
>>> should not be recovered from. Thus those test cases will result in cores
>>> in debug builds. Not great. More importantly, we can trigger this from
>>> bad input.
>>>
>>> I'm sorry, but I have revert my previous statement and return BADARG
>>> instead.
>>>
>>> I'll update the code and put it in master-opu.
>>>
>>> // egil
>>>
>>> On 2013-01-21 04:17, Serge Aleynikov wrote:
>>>> On 1/19/2013 8:40 PM, Björn-Egil Dahlberg wrote:> I don't think the
>>>> 'compact' option is doing what is says. See the following:
>>>>> 25> erlang:float_to_list(7/3, [{decimals, 6}, compact]).
>>>>> "2.3333"
>>>>> 26> erlang:float_to_list(7/3, [{decimals, 6}]).
>>>>> "2.333333"
>>>>>
>>>> Egil,
>>>>
>>>> I repushed the fix for this issue along with your recommendation to
>>>> limit the range of Decimals.  The only thing - the valid range is not
>>>> 0..255, but 0..249, since we need to keep in mind that a properly
>>>> formatted number includes "X." (minimally one digit before the decimal
>>>> point) and "e+YY" (in case of scientific notation).
>>>>
>>>> We still could get internal_error, when the number is too large
>>>> irrespective of the number of decimals:
>>>>
>>>>       float_to_list(1.0e+300, [{decimals, 1}]).
>>>>
>>>> Here the number doesn't fit in the buffer irrespective of the tail
>>>> after
>>>> the decimal point.  This brings me back to the question you raised
>>>> earlier in the thread if 256 is indeed a good default for the buffer
>>>> size or it needs to be increased.  I still think it's good as when one
>>>> deals with formatting such large numbers, he should use scientific
>>>> notation, so float_to_list(1.0e+300, [{scientific, 1}]) would do just
>>>> fine.
>>>>
>>>> Added appropriate test cases.
>>>>
>>>> While trying one test case, there's a weird issue that I don't
>>>> understand (or maybe it's too late now and I am failing to see
>>>> something
>>>> silly).  Why am I not able to catch the internal_error exception?
>>>>
>>>> This is expected:
>>>> 7> (catch float_to_list(1.0,  [{decimals, 250}])).
>>>> {'EXIT',{badarg,[{erlang,float_to_list,
>>>>                            [1.0,[{decimals,250}]],
>>>>                            []},
>>>>                    ...}
>>>>
>>>> This is not expected. I should see the same
>>>> {'EXIT', {internal_error, _}} result, no?
>>>>
>>>> 8> (catch float_to_list(1.0e300,  [{decimals, 1}])).
>>>>
>>>> =ERROR REPORT==== 20-Jan-2013::22:01:26 ===
>>>> Error in process <0.40.0> with exit value:
>>>> {internal_error,[{erlang,float_to_list,[1.000000e+300,[{decimals,1}]],[]},{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,568}]},{erl_eval,expr,5,[{file,"erl_eval.erl"},{line,352}]},{shell,exprs,7,[{file,"shell.erl"},{line,667}]},{shell,eval_exprs...
>>>>
>>>>
>>>>
>>>>
>>>> ** exception exit: internal_error
>>>>        in function  float_to_list/2
>>>>           called as float_to_list(1.0e300,[{decimals,1}])
>>>>
>>>> This doesn't catch the exception either:
>>>>
>>>> 9> try float_to_list(1.0e300,  [{decimals, 1}]) catch _:W -> W end.
>>>>
>>>> =ERROR REPORT==== 20-Jan-2013::22:02:19 ===
>>>> Error in process <0.45.0> with exit value:
>>>> {internal_error,[{erlang,float_to_list,[1.000000e+300,[{decimals,1}]],[]},{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,568}]},{erl_eval,try_clauses,8,[{file,"erl_eval.erl"},{line,759}]},{shell,exprs,7,[{file,"shell.erl"},{line,667}]},{shell,eval_exprs...
>>>>
>>>>
>>>>
>>>>
>>>> ** exception exit: internal_error
>>>>        in function  float_to_list/2
>>>>           called as float_to_list(1.0e300,[{decimals,1}])
>>>>
>>>> Any idea why?  Is there something special about internal_error?  I
>>>> wanted a simple test case, but it fails due to uncaught exception:
>>>>
>>>> {'EXIT', {internal_error, _}} = (catch float_to_list(1.0e+300,
>>>> [{decimals, 1}]))
>>>>
>>>> Serge
> 
-------------- next part --------------
An embedded message was scrubbed...
From: Serge Aleynikov <>
Subject: Re: [erlang-patches] new float_to_list/2
Date: Thu, 10 Jan 2013 22:06:47 -0500
Size: 9595
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20130121/f9a74e66/attachment-0001.mht>


More information about the erlang-patches mailing list