IEEE-754 Float to int

Lucas Tanure tanure at linux.com
Wed Nov 23 07:30:09 EST 2016


On Tue, Nov 22, 2016 at 4:55 PM, Greg KH <greg at kroah.com> wrote:
> On Tue, Nov 22, 2016 at 04:44:43PM +0000, Lucas Tanure wrote:
>>
>>
>> On Tue, Nov 22, 2016 at 4:39 PM, Greg KH <greg at kroah.com> wrote:
>>
>>     On Tue, Nov 22, 2016 at 04:05:18PM +0000, Lucas Tanure wrote:
>>     > Hi,
>>     >
>>     > At some point my hardware gives me a 32bit IEEE-754 float, like this :
>>     >
>>     >
>>     > regmap_read(device->regmap, ADDR0, &temp);
>>     >
>>     > value = temp << 16;
>>     >
>>     > regmap_read(device->regmap, ADDR1, &temp);
>>     >
>>     > value |= temp;
>>     >
>>     >
>>     > So, value has a 32bit float now, and I would like to print just the
>>     integer
>>     > part, like :
>>     > Read 26.92387 --> Print 26.
>>     > Simple, no float operations.
>>     >
>>     > How I can do it ?
>>
>>     Just print the upper 16 bits shifted right by 16 bits.
>>
>>
>>     But why would you want to print the value anyway?  Who would use it?
>>
>> My hardware gives me the board temperature as a float 32bits.
>> And the hwmon sysfs api asks me to return the temperature as millidegree
>> Celsius.
>>
>> To follow the hwmon sysfs api rules, I need to get my float, multiply by 1000
>> and print the integer part.
>> There is a better way to do that ?
>
> Ah, yeah, sorry, my example is wrong.  There's got to be other drivers
> that also do this same thing, try asking on the hwmon mailing list, they
> should know how to do this best, as they are the ones responsible for
> that user/kernel api.
>
> thanks,
>
> greg k-h

Hi,

For future reference:

The best way to do it seems to be to write conversion function.
Receive the float in a u32, parse it's bits and return a s32. Can be
done without the use of floats.

Thanks!

-- 
Lucas Tanure



More information about the Kernelnewbies mailing list