From mboxrd@z Thu Jan 1 00:00:00 1970 From: tanure@linux.com (Lucas Tanure) Date: Wed, 23 Nov 2016 12:30:09 +0000 Subject: IEEE-754 Float to int In-Reply-To: <20161122165550.GA4925@kroah.com> References: <20161122163959.GB2919@kroah.com> <20161122165550.GA4925@kroah.com> Message-ID: To: kernelnewbies@lists.kernelnewbies.org List-Id: kernelnewbies.lists.kernelnewbies.org On Tue, Nov 22, 2016 at 4:55 PM, Greg KH 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 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