[英]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;
}
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
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()
寫入處理浮點數字,但對待%f
的float
,即使你的編譯器促進float
到double
穿過時...
。 尋找你的自定義實現和解決它拉%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.