温度将两个整数转换为浮点数
Temperature convert two int digits to float
如何将表示浮点数的数字和小数部分的两个无符号整数转换为一个浮点数。
我知道有几种方法可以做到这一点,例如将十进制组件转换为浮点数并将其相乘以获得小数并将其添加到数字中,但这似乎不是最佳的。
我正在寻找执行此操作的最佳方法。
/*
* Get Current Temp in Celecius.
*/
void GetTemp(){
int8_t digit = 0; // Digit Part of Temp
uint16_t decimal = 0; // Decimal Part of Temp
// define variable that will hold temperature digit and decimal part
therm_read_temperature(&temperature, &decimal); //Gets the current temp and sets the variables to the value
}
我想获取数字和小数部分并将它们转换为浮点类型,使其看起来像 digit.decimal .
最后可能看起来像这样,但我想找到最优化的解决方案。
/*
* Get Current Temp in Celecius.
*/
float GetTemp(){
int8_t digit = 0; // Digit Part of Temp
uint16_t decimal = 0; // Decimal Part of Temp
// define variable that will hold temperature digit and decimal part
therm_read_temperature(&temperature, &decimal); //Gets the current temp and sets the variables to the value
float temp = SomeFunction(digit, decimal); //This could be a expression also.
return temp;
}
////更新///- 7 月 5 日
我能够获取源代码,而不仅仅是利用库。我把它贴在这个 GIST DS12B20.c 中。
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
//Store temperature integer digits and decimal digits
digit=temperature[0]>>4;
digit|=(temperature[1]&0x7)<<4;
//Store decimal digits
decimal=temperature[0]&0xf;
decimal*=THERM_DECIMAL_STEPS_12BIT;
*digit_part = digit;
*decimal_part = decimal;
尽管该函数不会强制我们返回数字和小数形式的单独部分,但从温度传感器读取似乎需要这样做(除非我错过了某些东西并且可以将其作为浮点数检索(。
我认为最初的问题仍然是使用这两个部分将其转换为 C 中的浮点数(这是用于 AVR 和 8 位微处理器,使优化键(或能够直接将其作为浮点数检索的最佳方法是什么。
你真正遇到的是使用定点数。 这些可以用两种方式表示:要么是具有已知幅度的单个整数,要么是乘数(即。"十分之一"、"百分之一"、"千分之一"等等;示例:来自数字刻度的值,以万分之一克为单位,以 32 位整数保存 - 您除以 10000 得到克(,或作为两个整数,一个保存"累加"或"整数"值,另一个保存"小数"值。
看看
这里有一篇关于它的文章:"C 编程语言的定点扩展",https://sestevenson.wordpress.com/2009/09/10/fixed-point-extensions-to-the-c-programming-language/
引用该文章的一部分:
我不认为扩展简化了固定类型的使用 多。程序员仍然需要知道分配了多少位 到整数和小数部分,以及如何的数量和位置 位可能会更改(例如在乘法期间(。什么 扩展确实提供了一种访问饱和度和舍入的方法 处理器的模式,无需编写汇编代码。有了这个水平 访问,可以编写更高效的 C 代码来 处理这些操作。
斯科特·霍尔美国北卡罗来纳州罗利
你的问题包含一个错误的假设。
如果给定一个十进制字符串并想要一个浮点值,则第一步通常不应是将其转换为两个整数。
例如,考虑数字 2.1
和 2.01
。每种情况下的"小数部分"是什么?1 和 01?两者都等于 1。那可不行。
这种方法唯一有意义的情况是小数点后有固定的位数 - 在这种情况下,2.1可能会变成(2,1000(,2.01变成(2,100(,或者其他什么。但是,除非你有积极的理由这样做(我强烈怀疑(,否则你不应该这样做。
特别是,除非therm_read_temperature
是其他人为您提供的函数,并且您无法影响其接口,否则您应该使该函数的行为不同 - 例如,仅返回float
。(如果它是其他人提供的功能,并且您无法影响其界面,那么要在这里获得有用的答案,您需要确切地告诉我们它的定义是什么。
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常