2012-09-28 37 views
8

當我初始化我的程序float變量,我經常有這樣的載體:我必須使用0.f初始化浮點數嗎?

Vector forward(0.f,0.f,-1.f),right(1.f,0.f,0.f),up(0.f,1.f,0.f) 

(矢量僅3輛彩車像struct Vector{ float x,y,z; };

這看起來容易爲已讀:

Vector forward(0,0,-1),right(1,0,0),up(0,1,0) 

必須使用float s初始化我的float變量嗎?當我使用整數(或double s)初始化float時,我是否會失去任何東西或招致某種懲罰?

+0

您不應該真的使用Vector作爲結構名稱,因爲它很容易與stl :: vector混淆。您可以改爲將其命名爲vector3f或vector3d – SinisterMJ

+0

在FORTRAN中,您必須使用適當的賦值,因此零加倍必須爲0.0d0,而不是0.0e0或0.許多以FORTRAN開頭的人都會被此行爲燒燬,明確地把0.f放在他們的C++代碼中。相比之下,C++實際上指定了如何將0或1的字面值提升到適當的浮點值。 –

+0

我認爲初始化不會是問題。但是,如果您進行比較,則會使用更大的數據類型(0.0f與0.0),因此它往往會變慢。顯然取決於使用情況,但不使用正確的類型,則明確導致轉換。編譯時或運行時。避免它可以節省時間。 – stefan

回答

7

這兩者之間沒有語義上的區別。儘管如此,取決於某些編譯器,可能會生成額外的代碼。另請參閱thisthis SO同一主題的問題。

我可以證實,gcc產生相同代碼的

int main() 
{ 
    float a = 0.0f; /* or 0 or 0.0 */ 
    return 0; 
} 

所有變體,並且這個代碼是

.file "1.c" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    .cfi_offset 6, -16 
    movq %rsp, %rbp 
    .cfi_def_cfa_register 6 
    movl $0x00000000, %eax 
    movl %eax, -4(%rbp) 
    movl $0, %eax 
    popq %rbp 
    .cfi_def_cfa 7, 8 
    ret 
    .cfi_endproc 
.LFE0: 
    .size main, .-main 
    .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" 
    .section .note.GNU-stack,"",@progbits 

相關線上

movl $0x00000000, %eax 

更改a0.1(或0.1f)更改線路

movl $0x3dcccccd, %eax 

似乎gcc能夠推導出正確的恆定,不會產生額外的代碼。

1

這可能是一個很好的編程習慣,總是寫0.f,1.f等,即使經常海灣合作委員會可以找出什麼程序員意味着1.0等。

有問題的情況並不是那麼簡單的浮點變量初始化,而是一些稍微複雜的公式中的數值常量,其中運算符,浮點型變量和所述常量的組合很容易導致發生無意的雙值計算和代價高昂的float-雙浮點轉換。

合模這些轉換沒有明確檢查的編譯代碼爲他們變得非常困難,如果數值的預期類型的​​代碼大多省略時,它絕對需要,而不是隻包括在內。因此,對於我來說,我會選擇只輸入f的方法,並習慣於讓它們四處走動。

3

對於一個常量,它不應該的問題。在一個初始化的上下文中,任何數值類型的常數將被隱式轉換爲所述物體的被初始化的類型。這是由語言標準保證的。因此,所有這些:

float x = 0; 
float x = 0.0; 
float x = 0.0f; 
float x = 0.0L; // converted from long double to float 

同樣有效,並導致被存儲在x相同的值。

雖然在更復雜的表達式中的文字常量可能會有令人驚訝的結果。

在大多數情況下,每個表達式都是由其自身評估的,而不管它出現的上下文。任何隱式轉換應用之後該子表達式已被評估。

因此,如果你寫:

float x = 1/2; 

表達1/2將作爲一個int進行評價,得到0,然後將其轉化爲float. It will set X to 0.0F , not to 0.5f`。

我認爲你應該安全使用未定義的浮點常量(類型爲double)。

順便提一下,您可能會考慮在程序中使用double而不是float。正如我所提到的,double是一個未固定的浮點常量的類型,在某種意義上可以認爲是「默認」浮點類型。它通常比float有更多的範圍和精度,並且在性能上通常沒有太大的差別。

相關問題