8

フロートを印刷しようとしています。可変個引数関数は float では機能しないため、double に昇格されます。警告をダブルにキャストすることで、なんとか警告を取り除くことができます。一部の powerpc アーキテクチャで結果を出力する際に​​、%f で出力すると正しくない値が返されます。なんで ?

テストコード:

 #include <stdio.h>

 #define _echo_size(X) \
        printf ("Sizeof "#X" %u\n", sizeof(X))

int main (void)
{

        float x;
        long usec = 7L;

        _echo_size(float);
        _echo_size(double);
        _echo_size(short);
        _echo_size(int);
        _echo_size(long);
        _echo_size(long long);

        x = ((float) usec) / 2;
        printf("Expected: 3.5 Got: %1.1f\n", (double) x);
        printf("Expected: 3.5 Got: %1d.%.1d\n", (int)x,
                (int)((x-(int)x)*10));
        return 0;
}

X86 システムの結果:

Sizeof float 4
Sizeof double 8
Sizeof short 2
Sizeof int 4
Sizeof long 8
Sizeof long long 8
Expected: 3.5 Got: 3.5
Expected: 3.5 Got: 3.5

ppc システム結果:

Sizeof float 4
Sizeof double 8
Sizeof short 2
Sizeof int 4
Sizeof long 4
Sizeof long long 8
Expected: 3.5 Got: 0.0  <--- Why this ?
Expected: 3.5 Got: 3.5

ツールチェーンのバグですか?そうでなければ、フロートを印刷するエレガントな方法は何ですか?

4

2 に答える 2

1

ああ、ああ!の浮動小数点値x 、FPU が実行しているか、コンパイラがソフトウェアで実行しているかに関係なく、正しく計算されています。それはあなたの実装printf()がどうやら...%fdouble

printf()カスタム実装の組み込みシステムを使用していますか? もしそうなら、とにかく浮動小数点数を処理するように書かれていない可能性があります.浮動小数点数は組み込みシステムでさえ使用されないことが多いため、プログラマはしばしば整数変数と固定小数点演算を使用することを選択します.浮動小数点 (小さな組み込みシステムではまだかもしれません)。

または、別の可能性: あなたのカスタムprintf() 浮動小数点数を処理するように書かれていますが、コンパイラがそれを渡すときに に昇格しても、%fとして扱います。カスタム実装を見つけて修正し、スタックをではなくとしてプルオフします。(とにかくそれを行おうとすると、カスタム実装で警告が表示される場合がありますが、これは無視されている可能性があります。)そのコードで を検索し、 に変更します。(もちろん、その例では、 a の私自身の変数名です。変数名は異なる場合があります。)floatfloatdouble...%fdoublefloatva_arg(args,float)va_arg(args,double)argsva_list

于 2013-01-31T21:58:27.203 に答える
-3

「ビッグ・エンディアン」と「リトル・エンディアン」がすべてだと思います。

于 2013-01-15T14:28:17.600 に答える