正确转换C+中的浮点+; 什么是正确的/推荐的方式来告诉C++编译器“只警告我浮点转换,我不知道”?
在C中,我将启用与浮点转换相关的警告,然后使用显式C样式转换来消除与受控转换相关的警告 例如,计算正确转换C+中的浮点+; 什么是正确的/推荐的方式来告诉C++编译器“只警告我浮点转换,我不知道”?,c++,casting,floating-point,C++,Casting,Floating Point,在C中,我将启用与浮点转换相关的警告,然后使用显式C样式转换来消除与受控转换相关的警告 例如,计算a*a*a-b*b很容易在单精度浮点中溢出,因此您可能希望在双精度中计算,以后只使用单精度: double a = 443620.52; double b = 874003.01; float c = (float)(a*a*a - b*b); 上面的C样式显式转换将使编译器对从double转换为float的警告静音 阅读C++关于CAST的文档,我得出结论,C++中正确的方法如下: double
a*a*a-b*b
很容易在单精度浮点中溢出,因此您可能希望在双精度中计算,以后只使用单精度:
double a = 443620.52;
double b = 874003.01;
float c = (float)(a*a*a - b*b);
上面的C样式显式转换将使编译器对从double
转换为float
的警告静音
阅读C++关于CAST的文档,我得出结论,C++中正确的方法如下:
double a = 443620.52;
double b = 874003.01;
float c = static_cast<float>(a*a*a - b*b);
双a=443620.52;
双b=874003.01;
浮点数c=静态_值(a*a*a-b*b);
<>但是,这真的是C++中的正确方法吗?< /P>
我理解static_cast
语法背后的基本原理,以便尽可能避免强制转换
是的,我可以省略显式转换为float。但是,我需要禁用编译器警告,告诉我精度损失(否则我会得到许多不相关的警告,这会使我很难注意到真正相关的警告)。如果我禁用与fp相关的编译器警告,当我在其他代码位置错误地丢失精度时,我将失去被警告的可能性
那么,C++中浮点转换的正确方法是什么?p> 是的
float c = static_cast<float>(a*a*a - b*b);
但是像这样使用“C风格”转换是不好的风格,因为static\u cast
比C风格隐藏的错误要少
或者,如果您经常这样做,您可以定义一个函数:
inline float flt(double d){return static_cast<float>(d);}
它甚至比原来的C更紧凑(并且将被优化为零)。据我所知,有三种不同的方法可以避免警告:
static\u cast
float c=float(a*a*a-b*b)
)c1
、c2
和c3
避免出现警告:
int main()
{
double a = 443620.52;
double b = 874003.01;
// These three versions avoid the conversion warnings:
float c1 = (float)(a*a*a - b*b);
float c2 = static_cast<float>(a*a*a - b*b);
float c3 = float(a*a*a - b*b);
// Only these two give conversion warnings:
float c4(a*a*a - b*b);
float c5 = a*a*a - b*b;
(void)c1; // Just to avoid unused-variable warnings
(void)c2;
(void)c3;
(void)c4;
(void)c5;
}
intmain()
{
双a=443620.52;
双b=874003.01;
//这三个版本避免了转换警告:
浮点数c1=(浮点数)(a*a*a-b*b);
浮球c2=静态抛投(a*a*a-b*b);
浮点数c3=浮点数(a*a*a-b*b);
//只有这两个会发出转换警告:
浮球c4(a*a*a-b*b);
浮点数c5=a*a*a-b*b;
(void)c1;//只是为了避免未使用的变量警告
(无效)c2;
(无效)c3;
(c)c4;
(无效)c5;
}
只有
c4
和c5
触发警告。查看结果。但是在浮点编程中,从double
到float
的转换是很常见的。“代码”STATICEXCAST “丑陋”将是不必要的惩罚,因为该角色不仅是合法的,而且是必要的,无论编码风格有多好,都不可能避免。谢谢,您关于定义函数的建议完全符合我的需要,而且它是干净的C++编码风格。
float c = flt(a*a*a - b*b);
int main()
{
double a = 443620.52;
double b = 874003.01;
// These three versions avoid the conversion warnings:
float c1 = (float)(a*a*a - b*b);
float c2 = static_cast<float>(a*a*a - b*b);
float c3 = float(a*a*a - b*b);
// Only these two give conversion warnings:
float c4(a*a*a - b*b);
float c5 = a*a*a - b*b;
(void)c1; // Just to avoid unused-variable warnings
(void)c2;
(void)c3;
(void)c4;
(void)c5;
}