[erlang-patches] new float_to_list/2

Björn-Egil Dahlberg <>
Tue Jan 22 11:37:49 CET 2013


Heh, so this is not your fault =)

R15B03 has this behaviour,
R13B has this behaviour as well.

Your new testcase is too strict.

// Björn-Egil


On 2013-01-22 11:08, Björn-Egil Dahlberg wrote:
> 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
>
> _______________________________________________
> erlang-patches mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-patches
>
>



More information about the erlang-patches mailing list