[erlang-patches] new float_to_list/2

Björn-Egil Dahlberg <>
Tue Jan 22 11:08:01 CET 2013


Found an issue not caught in pu due to windows being down because of 
other issues in pu on windows.


*** User 2013-01-21 22:53:27.711 ***
num_bif_SUITE:t_float_to_list failed on line 126
Reason: {badmatch,"1.00000000000000000000e+000"}




=== Ended at 2013-01-21 22:53:27
=== location [{num_bif_SUITE,t_float_to_list,126},
               {test_server,ts_tc,1362},
               {test_server,run_test_case_eval1,979},
               {test_server,run_test_case_eval,928}]
=== reason = no match of right hand side value "1.00000000000000000000e+000"
   in function  num_bif_SUITE:t_float_to_list/1 (num_bif_SUITE.erl, line 
126)
   in call from test_server:ts_tc/3 (test_server.erl, line 1362)
   in call from test_server:run_test_case_eval1/6 (test_server.erl, line 
979)
   in call from test_server:run_test_case_eval/9 (test_server.erl, line 928)


   126:     "1.00000000000000000000e+00"  = float_to_list(1.0), <- this one

This is on Windows XP.

// Björn-Egil


On 2013-01-21 15:42, Serge Aleynikov wrote:
> 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



More information about the erlang-patches mailing list