8

MSVC++ を使用しており、コードで特別な値 INFINITY を使用したいと考えています。

MSVC++ で無限に使用するバイト パターンまたは定数は何ですか?

1.0f/0.0f の値が 0 に見えるのはなぜですか?

#include <stdio.h>
#include <limits.h>

int main()
{
  float zero = 0.0f ;
  float inf = 1.0f/zero ;

  printf( "%f\n", inf ) ; // 1.#INF00
  printf( "%x\n", inf ) ; // why is this 0?

  printf( "%f\n", zero ) ; // 0.000000
  printf( "%x\n", zero ) ; // 0

}
4

5 に答える 5

20

使用numeric_limits:

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();
于 2010-03-29T13:55:19.787 に答える
11

printf("%x\n", inf)整数 (MSVC では 32 ビット) を想定していますが、double を受け取ります。陽気さが続きます。エラー、つまり、未定義の動作です。

(そして、はい、可変引数リストの場合、浮動小数点数が double に昇格されるため、double を受け取ります)。

とにかく編集しますnumeric_limits。他の返信にもあるように、を使用する必要があります。

于 2010-03-29T13:59:08.913 に答える
3

printf の可変引数リストでは、float が double に昇格されます。double としての無限のリトル エンディアン バイト表現は、00 00 00 00 00 00 F0 7F です。

peterchen が述べたように、"%x" は double ではなく int を想定しています。したがって、printf は引数の最初の sizeof(int) バイトのみを調べます。MSVC++ のどのバージョンも int を 4 バイトより大きく定義していないため、すべてゼロになります。

于 2010-04-14T13:16:22.290 に答える
2

printf() に嘘をつくと、それが間違ってしまいます。%x 書式指定子を使用すると、FPU スタックで渡される float ではなく、整数がスタックで渡されることが期待されます。修理:

printf( "%x\n", *(__int32*)&inf ) ;

<limits>C++ ヘッダー ファイルから無限を取得できます。

float inf = std::numeric_limits<float>::infinity().
于 2010-03-29T14:02:12.710 に答える
2

をご覧くださいnumeric_limits::infinity

于 2010-03-29T13:54:42.877 に答える