2010-03-09 88 views
2

我已經開始使用「C++ Primer by Stephen Prate」學習C++,並且我正在嘗試完成其中一個練習。我想知道是否應該將arc_to_minute & arc_to_degree聲明爲float,或者像我已經做的那樣將它們轉換爲float。任何提示歡迎!聲明浮點數或浮點數嗎?

#include <iostream> 

int main() 
{ 
    using namespace std; 
    cout.setf(ios_base::fixed, ios_base::floatfield); 

    const int arc_to_minute = 60; 
    const int arc_to_degree = 60; 

    float degrees; 
    float minutes; 
    int seconds; 

    cout << "Degrees: "; 
    cin >> degrees; 
    cout << "Minutes: "; 
    cin >> minutes; 
    cout << "Seconds: "; 
    cin >> seconds; 

    //convert seconds to minutes and add 
    minutes = minutes + seconds/float (arc_to_minute); 

    //covert minutes to degrees and add 
    degrees = degrees + minutes/float (arc_to_degree); 

    cout << degrees; 
} 

回答

4

讓他們漂浮,沒有理由讓他們爲整數時,所有的計算在浮點完成:

const float arc_to_minute = 60.0f; 
const float arc_to_degree = 60.0f; 

請記住在恆定值情況下,直播將在編譯期進行無論如何,這是純粹的設計選擇,沒有性能變化。但總的來說,如果您發現自己正在投射,您可能選擇了不正確的數據類型。

對於什麼是值得的,當你需要投射時,你應該更喜歡C++風格的轉換。例如:

static_cast<float>(arc_to_minute); 
+1

在這種情況下,轉換可能會在編譯時完成,因爲沒有使用int flavor的操作,並且它是局部變量。但是,這通常不是真的。在我知道的任何芯片上從int轉換爲double時,編譯器必須發出指令以從int寄存器複製到浮點寄存器,該寄存器將執行轉換。 – Joel 2010-03-09 21:55:09

+0

我的意思是在這種情況下,更新澄清。 – GManNickG 2010-03-09 21:57:53

0

我沒有發現任何問題。快樂學習!

編輯:但對於鑄造,更喜歡static_cast。

2

將它們聲明爲float(或者更好的是,double),因爲這就是你要如何使用它們的方法。

+0

是的,雙重操作在現代處理器上相當快,有時比浮動操作快。我認爲我是對的。 – 2010-03-09 21:37:58

+0

無論如何,我總是有一種印象,就是在進行任何算術運算之前,花車被提升爲雙打。 – 2010-03-09 21:41:24

+0

根據語言標準,無論是推廣還是不推廣,都是可以接受的。 – dan04 2010-03-10 02:36:08