2016-11-14 10 views
0

У меня есть функция ниже, которая использует числа с плавающей запятой D1 и D2. Они являются переменными в уравнении.с плавающей точкой для масштабированного преобразования int

Я не хочу использовать поплавки. Я ограничен памятью встроенной платформы, для которой я развиваюсь (библиотека с плавающей запятой большая). Я бы хотел использовать только int. Таким образом, функция вернет int и использует int s в расчете.

Например, вместо 22.95 градусов функция вернет 229500 градусов.

Кто-нибудь знает, как я рассчитываю, какие значения D1 и D2 должны стать?

Диапазон значений, возвращаемых функцией, составляет от -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); 
} 

Это функция, которую я хочу преобразовать, чтобы использовать только ints. int readTemperatureC() { int val; // Исходное значение, возвращаемое датчиком int temperature; // температура, полученная из необработанного значения

// 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); 
} 
+2

Каков диапазон значений, возвращенное функцией 'ре adTemperatureRaw', а что такое 'sizeof int' на вашей платформе? –

+0

Возможно, длинный D1 = -40 * 10000L; int D2 = 100; return (_val * D2) + D1; '? – chux

+0

@MichaelWalz: Первая - это текущая реализация, а вторая - желаемая реализация. –

ответ

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.


У меня есть мои сомнения, что значения FP из -40.0 и 0.01 являются правильными после рассмотрения data sheet

OP имеет commented правильный data sheet. Из раздела 4.3 Температура

Таблица 8
д (VDD = 5 вольт) = -40,1 ​​° C
д = 0,01 ° C

T = D + D * ТАК Т

#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 
+0

Как вы догадались, какой HW использует OP? –

+0

OK, я пропустил это. Мы можем удалить эти комментарии. Я удалю мой –

+0

Привет всем, спасибо вам за помощь. на самом деле это sht10 от adafruit. e, где я получил значения из [https://github.com/practicalarduino/SHT1x/blob/master/SHT1x.cpp]. –

 Смежные вопросы

  • Нет связанных вопросов^_^