温度将两个整数转换为浮点数

Temperature convert two int digits to float

本文关键字:整数 转换 浮点数 两个 温度      更新时间:2023-10-16

如何将表示浮点数的数字和小数部分的两个无符号整数转换为一个浮点数。

我知道有几种方法可以做到这一点,例如将十进制组件转换为浮点数并将其相乘以获得小数并将其添加到数字中,但这似乎不是最佳的。

我正在寻找执行此操作的最佳方法。

/*
 * 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 得到克(,或作为两个整数,一个保存"累加"或"整数"值,另一个保存"小数"值。

看看 标头。 这声明了保存这些定点数的类型和函数,并用它们执行数学运算。 例如,在添加小数部分时,您必须担心滚动到下一个整数值,然后您希望增加结果的累加器。 通过使用标准函数,您可以利用内置的处理器功能进行定点数学运算,例如 AVR、PIC 和 MPS430 微控制器中提供的功能。 非常适合温度传感器、GPS 接收器、秤(天平(和其他具有有理数但只有整数寄存器或算术的传感器。

这里有一篇关于它的文章:"C 编程语言的定点扩展",https://sestevenson.wordpress.com/2009/09/10/fixed-point-extensions-to-the-c-programming-language/

引用该文章的一部分:

我不认为扩展简化了固定类型的使用 多。程序员仍然需要知道分配了多少位 到整数和小数部分,以及如何的数量和位置 位可能会更改(例如在乘法期间(。什么 扩展确实提供了一种访问饱和度和舍入的方法 处理器的模式,无需编写汇编代码。有了这个水平 访问,可以编写更高效的 C 代码来 处理这些操作。

斯科特·霍尔美国北卡罗来纳州罗利

你的问题包含一个错误的假设。

如果给定一个十进制字符串并想要一个浮点值,则第一步通常不应是将其转换为两个整数。

例如,考虑数字 2.12.01 。每种情况下的"小数部分"是什么?1 和 01?两者都等于 1。那可不行。

这种方法唯一有意义的情况是小数点后有固定的位数 - 在这种情况下,2.1可能会变成(2,1000(,2.01变成(2,100(,或者其他什么。但是,除非你有积极的理由这样做(我强烈怀疑(,否则你不应该这样做。

特别是,除非therm_read_temperature是其他人为您提供的函数,并且您无法影响其接口,否则您应该使该函数的行为不同 - 例如,仅返回float。(如果它是其他人提供的功能,并且您无法影响其界面,那么要在这里获得有用的答案,您需要确切地告诉我们它的定义是什么。