正确转换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

在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 = 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更紧凑(并且将被优化为零)。

据我所知,有三种不同的方法可以避免警告:

  • 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;
    }