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