17

floatプログラムで変数を初期化するとき、私は一般的に次のようなベクトルを持っています:

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)

floatsを使用して変数を初期化する必要がありますfloatか?double整数(またはs)を使用して?を初期化すると、何かが失われたり、何らかのペナルティが発生したりしますfloatか?

4

3 に答える 3

12

2つの間に意味上の違いはありません。ただし、一部のコンパイラによっては、余分なコードが生成される可能性があります。同じトピックのこれこの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

(または)に変更すると、行が次aのように変更されます0.10.1f

    movl    $0x3dcccccd, %eax

gcc正しい定数を推測でき、余分なコードを生成しないようです。

于 2012-09-28T09:49:31.880 に答える
7

単一のリテラル定数の場合は問題になりません。初期化子のコンテキストでは、数値型の定数は初期化されるオブジェクトの型に暗黙的に変換されます。これは、言語標準によって保証されています。したがって、これらすべて:

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は , yielding として評価され、intx 0.0f 0.5f`0に変換されます。float. It will setto, not to

接尾辞なしの浮動小数点定数(タイプは )を使用しても安全だと思いますdouble

ちなみに、プログラムdoubleではなく使用を検討することもできfloatます。doubleは、前述のとおり、接尾辞のない浮動小数点定数の型であり、ある意味で「デフォルト」の浮動小数点型と考えることができます。通常、 よりも範囲と精度が高くfloat、通常、パフォーマンスに大きな違いはありません。

于 2013-05-23T19:27:36.893 に答える
2

gcc が 1.0 などによってプログラマーの意味を理解できることがよくある場合でも、常に 0.f、1.f などを記述することは、プログラミングの良い実践になる可能性があります。

問題のあるケースは、些細な float 変数の初期化ではなく、演算子、float 変数、および前述の定数の組み合わせが、意図しない double 値の計算やコストのかかる float-double-float 変換の発生につながる、やや複雑な式の数値定数です。 .

コンパイルされたコードを特にチェックせずにこれらの変換を見つけることは、数値の意図した型がコードでほとんど省略され、代わりに絶対に必要な場合にのみ含まれている場合、非常に困難になります。したがって、私は f を入力するだけで、それらを使用することに慣れるというアプローチを選択します。

于 2013-05-23T19:08:46.933 に答える