[英]How does C handle mixed precision operation
float FLOAT = 1.0f;
double DOUBLE = 2.0;
float a = FLOAT / DOUBLE;
double b = FLOAT / DOUBLE;
a
和b
是否a
相同的方式計算?
如何在編譯時轉換FLOAT
和DOUBLE
?
似乎默認轉換是上轉換,以防止丟失。
實際上,我正在對精度敏感的GPU上進行一些計算,並且代碼應如下所示:
float a = FLOAT / 2.0 + 1.0/3.0;
該代碼包含非常長的表達式,其中包含許多數字和var(實際上是從Matlab代碼生成的)。
那我該如何控制這種轉換行為呢? 除了將所有數字2.0f
(表達式中的數千個數字)。
根據C標准(6.3.1.8常規算術轉換)
否則,如果一個操作數的相應實型為double,則將另一個操作數轉換為相應實型為double的類型,而不會改變類型域。
所以在聲明的兩個初始化表達式中
float a = FLOAT / DOUBLE;
double b = FLOAT / DOUBLE;
float
類型的操作數將轉換為double
類型。 因此,表達式的結果具有double
類型。 在第一個聲明中,結果進一步轉換為float
因為變量a
具有float
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.