2012-08-13 59 views
1

我有下面的等式:不需要的舍入C++

//get thermistor resistor value 
temp=(THERMISTOR_R0)/((temp2/temp)-1); 

//get temperature value in Kelvins and convert to Celsiuis 
temp=(THERMISTOR_BETA)/log(temp/(THERMISTOR_R0*exp((-THERMISTOR_BETA)/298))); 
temp-=273; 

desiredVoltage =((15700-(25*temp))/10); 

THERMISTOR_R0THERMISTOR _BETA是恒定的。

temptemp2desiredVoltage是无符号整数,并在计算之前定义。

问题是,例如,当术语((temp2/temp)-1)低于1时,它下降到0。我想摆脱这种四舍五入,因为它导致了我的计算中的巨大问题。

我该怎么做?

回答

7

它不是四舍五入,它是整数除法。如果/运算符的两个操作数都是整数类型,则C++的行为将执行整数除法,该整数除只保留结果的整数部分(因为速度更快,所以在某些算法中通常需要这样做)。要获得“常规”划分,请确保至少有一个涉及的操作数是浮点类型(float,doublelong double);你可以做到这一点无论声明涉及的FP类型

double temp2, temp; 

要么坚持在一个操作数的前铸造的变量。

temp=(THERMISTOR_R0)/((double(temp2)/temp)-1); 

(注意,在这里你会截断招致如果temp是整体式的静止)。

最可能的是,在这里你只是想声明temptemp2double(或float如果你是在一个真正的资源紧的环境中工作)。

此外,除以数字文字时,请记住,如果您不写小数点,它将是一个int文字,如果您编写它将是double。例如,298int,298.double,因此1/20,但是1/2.0.5

+1

另外,如果THERMISTOR_BETA是一个整数,OP可能需要为'(-THERMISTOR_BETA)/ 298'做类似的操作。 – 2012-08-13 23:24:26

+0

@MichaelBurr:虽然编写'(-THERMISTOR_BETA)/ 298.'(其中'298.'是一个'double'文字)就足够了。 – 2012-08-14 08:56:37

2

如果需要浮点除法行为,请确保使用浮点类型。

+0

所以如果我要声明'unsigned float temp,temp2;'它会解决我的问题吗? – moesef 2012-08-13 23:05:34

+4

可能不会,因为在C++中没有'unsigned float'。 – 2012-08-13 23:07:14

0

编译器将向下舍入浮点值。

通常,这个问题是通过在转换为整数之前将值加0.5来解决的。您可能希望显式使用浮点值(或强制转换),然后在将结果转换为整数之前将0.5加到结果上。

+1

将FP值分配给整型变量时发生截断,但似乎在这里发生的是执行整型除法,因为操作数的类型都是整数。 – 2012-08-13 23:11:31