2012-08-13 55 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