C++ 不必要的四舍五入C++;
我有以下方程式:C++ 不必要的四舍五入C++;,c++,math,rounding,C++,Math,Rounding,我有以下方程式: //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 =((15
//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);
热敏电阻R0
和热敏电阻β
为常数
temp
、temp2
和desired voltage
是无符号整数,在计算之前定义
例如,问题是,当术语((temp2/temp)-1)
低于1时,它将舍入为0。我想去掉这个舍入,因为它给我的计算带来了巨大的问题
如何执行此操作?如果需要浮点除法行为,请确保使用浮点类型。不是四舍五入,而是整数除法。如果<代码> /< /C>操作符的两个操作数都是整数类型,C++的行为就是执行整数除法,它只保留结果的整数部分(这在某些算法中经常需要,因为它更快)。 要获得“常规”除法,请确保所涉及的操作数中至少有一个是浮点类型(
float
、double
或long double
);可以将涉及的变量声明为FP类型
double temp2, temp;
在其中一个操作数前面粘贴强制转换
temp=(THERMISTOR_R0)/((double(temp2)/temp)-1);
(请注意,如果temp
仍然是整型,那么在这里您将导致截断)
最有可能的是,在这里,您只需将temp
和temp2
声明为double
(或者float
,如果您在资源非常紧张的环境中工作的话)
此外,当除以数值文字时,请记住,如果不写入小数点,它将是
int
文字;如果写入,它将是双精度
。例如,298
是int
,298.
是double
,因此1/2
是0
,但1/2.
是0.5
编译器向下舍入浮点值
通常,在转换为整数之前,通过向值添加0.5来解决此问题。您可能希望显式地使用浮点值(或强制转换),然后在强制转换为整数之前向结果中添加0.5。因此,如果我要声明
无符号浮点温度,temp2代码>它可以解决我的问题?可能不是,因为C++中没有<代码>未签名的浮点< /C> >截断发生在将FP值赋给整型变量时,但是这里发生的是因为整数的除法运算类型是整数的,而且OP可能需要做类似的代码< > >(-Thermator_BETA)/298
如果Thermator_BETA
是一个整数。@MichaelBurr:不过,它应该足以写入(-Thermator_BETA)/298。
(其中298.
是一个双文本)。