浮点到缩放int转换

时间:2016-11-14 16:27:36

标签: c int floating

我在下面有一个使用浮点数D1D2的函数。它们是等式中的变量。

我不想使用浮点数我在开发的嵌入式平台上受限于内存(浮点库很大)。我只想使用int s。因此该函数将返回int并在计算中使用int

例如,代替22.95度,该功能将返回229500度。

有人知道我如何计算D1D2应该成为什么值吗?

函数返回的值的范围是-40到120度。

int的大小为4个字节。

float readTemperatureC()
{
  int val;                // Raw value returned from sensor
  float temperature;      // Temperature derived from raw value

  // Conversion coefficients from SHT15 datasheet
  const float D1 = -40.0;  // for 14 Bit @ 5V
  const float D2 =   0.01; // for 14 Bit DEGC

  // Fetch raw value
  val = readTemperatureRaw();

  // Convert raw value to degrees Celsius
  temperature = (_val * D2) + D1;

  return (temperature);
}

这是我要转换为仅使用int的函数。     int readTemperatureC()     {       int val; //从传感器返回的原始值       温度; //温度来自原始值

  // Conversion coefficients from SHT15 datasheet
  const int D1 = ?;  // for 14 Bit @ 5V
  const int D2 = ?; // for 14 Bit DEGC

  // Fetch raw value
  val = readTemperatureRaw();

  // Convert raw value to degrees Celsius
  temperature = (val * D2) + D1;

  return (temperature);
}

1 个答案:

答案 0 :(得分:1)

  

而不是22.95度,该函数将返回229500度。

将系数乘以10,000并使用整数运算。

// Conversion coefficients from SHT15 datasheet
// const float D1 = -40.0;  // for 14 Bit @ 5V
// const float D2 =   0.01; // for 14 Bit DEGC
const int D1 = (int) (-40.0*10000);
const int D2 = (int) (0.01*10000);
...
temperature = (_val * D2) + D1;

注意:OP表示4字节int

我怀疑在查看data sheet 后,-40.00.01的FP值是否正确

OP有commented个正确的data sheet。从4.3节温度

表8 d 1 (VDD = 5 V)= - 40.1°C
d 2 = 0.01°C

T = d 1 + d 2 * SO T

#define d1 (-40.1 /* degrees C */)
#define d2 (0.01 /* degrees C/d2a */)

#define T_SCALE 10000
#define T_OFFSET ((int)(d1 * SCALE))
#define T_SLOPE  ((int)(d2 * SCALE))

// Sensor output - temperature
// 0 to 0x3FFF (14-bit)
int SOT = readTemperatureRaw();

// temeprature in 1/10,000 degree C
int temperature = (SOT * T_SLOPE) + T_OFFSET;

// With 32-bit `int`, no range issue
// -401000 <= temperature <= 1237300