0

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

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

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

/*
 * 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 部分并将它们转换为浮点类型,使其看起来像 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 位微处理器,使优化关键)或能够直接检索它作为一个浮子。

4

2 回答 2

2

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

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

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

引用那篇文章的一部分:

我不认为扩展非常简化了固定类型的使用。程序员仍然需要知道有多少位分配给整数和小数部分,以及位的数量和位置如何变化(例如在乘法过程中)。扩展确实提供了一种无需编写汇编代码即可访问处理器的饱和和舍入模式的方法。通过这种访问级别,可以编写更高效的 C 代码来处理这些操作。

Scott G. Hall 美国北卡罗来纳州罗利

于 2012-08-07T21:09:30.263 回答
1

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

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

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

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

特别是,除非therm_read_temperature是其他人为您提供的函数并且您无法影响其接口,否则您应该使该函数的行为有所不同——例如,只返回一个float. (如果它其他人提供的功能并且您无法影响其接口,那么要在此处获得有用的答案,您需要准确地告诉我们它的定义是做什么。)

于 2012-05-13T21:44:08.643 回答