2009-05-19 25 views
1

我有一個很大的公式,必須計算大約每秒300次。我的大部分變量都是浮點數,但有些變量只是進入該公式的參數。在某些情況下,不需要浮動。我可以使用int參數。但是我想知道在計算中混合int和float類型是否會導致系統轉換類型,而不是保存性能。在大型計算中只使用float而不是混合float和int會更好嗎?

回答

4

首先,是的,系統會轉換變量,以便它可以在通用基類型中進行計算。其次,這不是你應該最擔心的,除非你已經對你的程序進行了基準測試,並且你知道這是你的瓶頸。

只是爲了澄清的第一部分,不過,如果你有

double a = 10.0; 
int b = 5; 
int c = 2; 

和公式是

double d = a + (b/c); 

,我知道會用整數數學在這裏他們可以最系統,爲在這種情況下除法運算,然後在需要的地方切換到浮點運算。簡而言之,整數和浮點數學之間的決定是在操作員級完成的。

+0

請注意,在某些CPU上,整數除法實際上可能比fp除法更慢。例如,在Intel Atom上,IDIV m32需要57個週期,而FDIV是25-65。但是,這些操作可能在單獨的功能單元上,因此它們可以同時執行。 – bdonlan 2009-05-20 01:27:51

0

我想說這取決於什麼是對你更重要。在性能方面,最好使用float作爲它,你不會投入整數次(每秒約300次;))。

如果它是在你的代碼中經常使用的東西,那麼你可以關心它,否則不需要實現任何改變。如果您還沒有聽說或閱讀「The Fallacy of Premature Optimisation」,現在這樣做可能會對您有所幫助。規則是20%的代碼需要80%的性能。

1

我懷疑有很好的經驗法則。它可能很大程度上取決於處理器,編譯器以及您正在執行的操作的特定組合。設置一個計時器,在計算之前和之後運行,並進行各種調整並查看哪些運行速度更快。

原則上,從float到int的轉換經常會讓你放慢速度,因爲需要額外的指令來做到這一點,但實際上唯一的方法是測量。查看各種變化的彙編器轉儲可以幫助您獲得良好的直覺,但即使如此,處理器也可能以流水線方式,甚至以非明顯的方式對指令進行重新排序。

另外,一定要調查海灣合作委員會的浮點優化開關,並確保您使用最好的你。

2

取決於...結果的正確性對您而言很重要嗎?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int x = 5; 
    int y = 2; 
    float z = 12.3f; 

    float result = z + (x/y); 
    printf("%f\n", result); 

    result = z + ((float) x)/y; 
    printf("%f\n", result); 

    return EXIT_SUCCESS; 
} 

C:\Temp> t 
14.300000 
14.800000 

做什麼會給你正確的結果。

相關問題