簡體   English   中英

打印浮標。 (Powerpc)

[英]Printing floats. (Powerpc)

我正在嘗試打印花車。 盡管可變參數函數不適用於浮點數,但它們被提升為兩倍。 我可以通過將警告轉換為兩倍來消除警告。 在某些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

這是工具鏈中的錯誤嗎? 否則,打印浮標的優雅方法是什么?

哦,! 為您的浮點值x 正確計算的,不管你的FPU是否是做什么的,或者如果你的編譯器做你的軟件; 只是您的printf()實現顯然沒有將%f視為double ...

您是否在具有自定義printf()實現的嵌入式系統上? 如果是這樣,則可能根本不會編寫處理浮點數的方法,因為浮點數通常甚至不用於嵌入式系統,在嵌入式系統中,程序員經常選擇使用整數變量和定點算法,這在歷史上比浮點數(可能仍在小型嵌入式系統上)。

或者,另一種可能性:您的自定義printf() 寫入處理浮點數字,但對待%ffloat ,即使你的編譯器促進floatdouble穿過時... 尋找你的自定義實現和解決它拉%f從堆棧作為double ,而不是float (您的自定義實現可能會嘗試通過執行此操作來得到警告,而人們可能對此一直無視。 va_arg(args,float)在該代碼中搜索va_arg(args,float)並將其更改為va_arg(args,double) (當然,該示例中的args是我自己的va_list的變量名;您的變量名可能不同。)

我想這全是關於“大端”和“小端”的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM