【问题标题】:How does C handle mixed precision operationC如何处理混合精度运算
【发布时间】:2018-08-27 23:59:42
【问题描述】:
float  FLOAT  = 1.0f;
double DOUBLE = 2.0;

float  a = FLOAT / DOUBLE;
double b = FLOAT / DOUBLE;

ab 的计算方式是否相同?

FLOATDOUBLE 在编译时如何转换?

看来默认转换是向上转换,以防丢失。

其实我是在 GPU 上做一些对精度敏感的计算,代码应该是这样的:

float a = FLOAT / 2.0 + 1.0/3.0;

其中代码包含很长的表达式,包含许多数字和变量(实际上是从 Matlab 代码生成的)。

那我该如何控制这种转换行为呢? 除了在2.0f 中写下所有数字(表达式中的数以千计)。

【问题讨论】:

标签: c type-conversion double implicit-conversion


【解决方案1】:

根据 C 标准(6.3.1.8 常用算术转换)

否则,如果任一操作数对应的实数类型为双精度, 另一个操作数在不改变类型域的情况下转换为 对应的实数类型为double的类型。

所以在声明的两个初始化表达式中

float  a = FLOAT / DOUBLE;
double b = FLOAT / DOUBLE;

float 类型的操作数被转换为double 类型。因此,表达式的结果具有double 类型。在第一个声明中,结果进一步转换为 float,因为变量 a 的类型为 float

【讨论】:

  • 谢谢。所以这意味着如果数字没有像2.0f 那样写入,我将遭受 SP 计算中的隐式转换。还有其他方法可以控制隐式转换吗?
  • @CHCl3 要控制隐式转换,您应该使用显式转换。:)
  • @CHCl3 您唯一能做的就是将所有非浮点操作数转换为预期类型。 float a = FLOAT / (float)DOUBLE;。正如您现在可能注意到的那样,是否使用 f 作为文字可能非常重要。
  • @Vlad 来自莫斯科 正如我上面提到的,表达式很长,而且这种方法并不便宜(我必须将所有数字替换为所需的精度,可能是数千个数字)。有没有办法改变默认的转换行为?
  • @CHCl3 使用循环和值数组。
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2014-05-20
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多