温度将两个int数字转换为float

时间:2012-05-13 21:38:49

标签: c++ c floating-point avr avr-gcc

如何将表示float的数字和小数部分的两个无符号整数转换为一个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部分并将它们转换为float类型,使其看起来像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位微处理器,制作优化键)的最佳方法它直接作为一个浮点数。

2 个答案:

答案 0 :(得分:1)

您的问题包含错误的假设。

如果给你一个十进制字符串并想要一个浮点值,第一步通常应该将它变成两个整数。

例如,考虑数字2.12.01。在每种情况下,“小数部分”是什么? 1和01?两者都相等1.这不好。

这种方法有意义的唯一情况是小数点后面有固定数量的位数 - 在这种情况下可能2.1变成(2,1000)和2.01变成(2,100),或者某种东西。但除非你有充分的理由这样做(我强烈怀疑)你不应该这样做。

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

答案 1 :(得分:1)

您真正遇到的是使用定点数字。这些可以用两种方式表示:或者是具有已知幅度或乘数的单个整数(即“十分之一”,“百分之一”,“千分之一”等等;例如:来自数字刻度的千分之一的值一个克,以32位整数保存 - 除以10000得到克数),或者作为两个整数,其中一个保持“累计”或“整数”值,另一个保持“小数”值。 / p>

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

以下是一篇关于它的文章:“C编程语言的固定点扩展”,https://sestevenson.wordpress.com/2009/09/10/fixed-point-extensions-to-the-c-programming-language/

引用该文章的一部分:

  

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

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