2

次の方程式があります。

//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定数です。

temptemp2およびdesiredVoltageunsigned int であり、計算前に定義されます。

問題は、たとえば、項((temp2/temp)-1)が 1 を下回ると、0 に切り捨てられることです。計算に大きな問題を引き起こしているため、この丸めを取り除きたいと考えています。

どうすればいいですか?

4

3 に答える 3

8

丸めではなく、整数除算です。演算子の両方のオペランドが/整数型である場合、C++ の動作は整数除算を実行することであり、結果の整数部分のみが保持されます (これは高速であるため、一部のアルゴリズムでよく必要になります)。

「通常の」除算を取得するには、関連するオペランドの少なくとも 1 つが浮動小数点型 ( floatdoubleまたはlong double) であることを確認してください。関連する変数を FP 型として宣言することで、これを行うことができます

double temp2, temp;

いずれかのオペランドの前にキャストを貼り付けます。

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

temp(まだ整数型の場合、切り捨てが発生することに注意してください)。

ほとんどの場合、ここでは単純にtempand temp2asを宣言する必要がありますdouble(またはfloat、リソースが非常にタイトな環境で作業している場合)。

また、数値リテラルで割る場合は、小数点を書かないとリテラルになり、int書くとaになるので注意してdoubleください。例: は298です、int298.ですdouble、そう1/2です0、しかし1/2.です0.5

于 2012-08-13T23:07:46.900 に答える
2

浮動小数点除算の動作が必要な場合は、必ず浮動小数点型を使用してください。

于 2012-08-13T23:04:23.753 に答える
0

コンパイラは浮動小数点値を切り捨てます。

通常、この問題は、整数に変換する前に値に 0.5 を加算することで解決されます。浮動小数点値を明示的に使用 (またはキャスト) してから、結果に 0.5 を加算してから整数にキャストし直すことができます。

于 2012-08-13T23:08:56.650 に答える