You can pull the significant bits and the exponent values out of a Float16
and then use those to compute the value as a Float32:
https://en.wikipedia.org/wiki/Half-precision_floating-point_format

On Wed, Oct 19, 2016 at 1:00 PM, Yichao Yu <yyc1...@gmail.com> wrote:

>
>
> On Wed, Oct 19, 2016 at 12:54 PM, Kyle Kotowick <k...@kotowick.ca> wrote:
>
>> Aha, that fixed it!
>>
>> I'm running into one issue though. What do I do with the data when it's a
>> "Float16" type? C++ has no way to represent a 16-bit float, so I'm having
>> difficulty converting it to a regular 32-bit float.
>>
>
> Find a compiler / library that supports it? ;-p
>
> I'm only half joking. You can always just keep a pointer to the value or
> store it in a int16_t as long as you don't need to do any operation on it.
> If you want to operate on them in C++ natively you would have to find a
> C/C++ compiler/library (or write the necessary operations yourself) that
> supports __fp16.
>
>
>>
>> jl_value_t *ret = jl_eval_string(code_string);
>> jl_array_t *ret_array = (jl_array_t*)ret;
>>
>> if (jl_array_eltype(ret) == jl_float16_type) {
>>
>>  /* now I need to convert the 'ret_array' to a C++ array of floats, but
>> how do I do that when they're given in Float16? */
>>
>> }
>>
>>
>> On Tuesday, 18 October 2016 20:57:10 UTC-4, Isaiah wrote:
>>>
>>> The issue here is that `jl_array_eltype` is already returning a type.
>>>
>>> `jl_typeis(v, t)` becomes `jl_typeof(v) == t`, so your checks become:
>>>
>>>     jl_typeof(array_type) == jl_int64_type
>>>
>>> But
>>>
>>>     jl_typeof(array_type) -> DataType
>>>
>>> Instead, either do the equality check directly:
>>>
>>>   array_type == jl_int64_type
>>>
>>> Or use the exported API only (jlapi.c):
>>>
>>>   strcmp(jl_typename_str(array_type), jl_typename_str(jl_int64_type))
>>>
>>> On Tue, Oct 18, 2016 at 7:52 PM, Kyle Kotowick <ky...@kotowick.ca>
>>> wrote:
>>>
>>>> I apologize for the formatting, that should be:
>>>>
>>>> jl_value_t *ret = jl_eval_string(code_string);
>>>> void* array_type = jl_array_eltype(ret);
>>>> jl_array_t *ret_array = (jl_array_t*)ret;
>>>>
>>>> if (jl_typeis(array_type, jl_int64_type)) {
>>>>   long *data = (long*) jl_array_data(ret_array);
>>>> }
>>>> else if (jl_typeis(array_type, jl_float64_type)) {
>>>>   double *data = (double*) jl_array_data(ret_array);
>>>> }
>>>>
>>>>
>>>> And the issue is that even if it is an Int64 or Float64, neither of
>>>> those IF statements will return true.
>>>>
>>>>
>>>>
>>>> On Sunday, 16 October 2016 21:36:03 UTC-4, Kyle Kotowick wrote:
>>>>>
>>>>> Awesome, thanks. Could you show how to use it in a minimal code
>>>>> example? Here's what I'm currently trying, but it does not appear to be
>>>>> working:
>>>>>
>>>>> jl_value_t *ret = jl_eval_string(code_string);
>>>>> void* array_type = jl_array_eltype(ret);
>>>>> jl_array_t *ret_array = (jl_array_t*)ret;
>>>>>
>>>>>
>>>>>
>>>>> if (jl_typeis(array_type, jl_int64_type)) {
>>>>>  long *data = (long*) jl_array_data(ret_array);
>>>>> }
>>>>> else if (jl_typeis(array_type, jl_float64_type)) { double *data = (
>>>>> double*) jl_array_data(ret_array);
>>>>> }
>>>>>
>>>>>
>>>>> On Friday, 14 October 2016 20:45:18 UTC-4, Isaiah wrote:
>>>>>>
>>>>>> On Fri, Oct 14, 2016 at 2:28 PM, Kyle Kotowick <ky...@kotowick.ca>
>>>>>> wrote:
>>>>>>>
>>>>>>>
>>>>>>> After determining that an array was returned, how would you
>>>>>>> determine what the inner type of the array is (i.e. the type of the 
>>>>>>> objects
>>>>>>> it contains)?
>>>>>>>
>>>>>>
>>>>>> `jl_array_eltype`
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> And furthermore, if it returns an array of type "Any", would there
>>>>>>> be any way to tell what the type is of any arbitrary element in that 
>>>>>>> array?
>>>>>>>
>>>>>>
>>>>>> `jl_typeof`, after retrieving the element (which will be boxed)
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Thanks!
>>>>>>>
>>>>>>
>>>>>>
>>>
>

Reply via email to